如题,
我写了一个,可是理论上还不是唯一的,有没有更好的办法呀:
procedure TForm1.Button1Click(Sender: TObject);
var i,j,c:integer;
  enchar : array[0..35] of char;
  str:string;
begin
 enchar[0] := '0';
  enchar[1] := '1';
  enchar[2] := '2';
  enchar[3] := '3';
  enchar[4] := '4';
  enchar[5] := '5';
  enchar[6] := '6';
  enchar[7] := '7';
  enchar[8] := '8';
  enchar[9] := '9';  enchar[10] := 'A';
  enchar[11] := 'B';
  enchar[12] := 'C';
  enchar[13] := 'D';
  enchar[14] := 'E';
  enchar[15] := 'F';
  enchar[16] := 'G';
  enchar[17] := 'H';
  enchar[18] := 'I';
  enchar[19] := 'J';  enchar[20] := 'K';
  enchar[21] := 'L';
  enchar[22] := 'M';
  enchar[23] := 'N';
  enchar[24] := 'O';
  enchar[25] := 'P';
  enchar[26] := 'Q';
  enchar[27] := 'R';
  enchar[28] := 'S';
  enchar[29] := 'T';  enchar[30] := 'U';
  enchar[31] := 'V';
  enchar[32] := 'W';
  enchar[33] := 'X';
  enchar[34] := 'Y';
  enchar[35] := 'Z';
 memo1.Lines.Clear;
 for i:= 1 to 1000 do
 begin
   str := floattostr(double(now));
   c:=pos('.',str);
   str := copy(str,1,c-1)+copy(str,c+1,length(str)-c);
   for j:= 1 to 18-length(str) do
   begin
     Randomize;
     str := str + enchar[Random(36)];
   end;
   memo1.Lines.Add(str);
 end;
end;

解决方案 »

  1.   

    for j:= 1 to 18-length(str) do  //把18  改成17   ????????
      

  2.   

    (1)测试 一下  length(str) 一般都是 15(2)    for j:= 1 to 18-length(str) do
       begin
         Randomize;
         str := str + enchar[Random(36)];
         sleep(10);//加这个
       end;
       memo1.Lines.Add(str);
      

  3.   


       sleep(10);//   
       str := floattostr(double(now));
       c:=pos('.',str);
       str := copy(str,1,c-1)+copy(str,c+1,length(str)-c);   这就行了,那就不用随机数了,反正也是用时间作种子吗
      

  4.   

    用這個:function CreateGUID(out Guid: TGUID): HResult;如需要,還可用這個:
    function GUIDToString(const ClassID: TGUID): string;
      

  5.   

    GUID 重码的概率几乎为零,就是她长了点 :)
      

  6.   

    to aiirii:老兄,能给个算法吗
      

  7.   

    我也想把这个算法用到java中去
      

  8.   

    相当建议采用GUID;
    如果能限制其仅由服务器生成(并且服务器的时间能得到保证),而不依赖于客户端的话,倒是可以考虑用时间来解决;
    你那个算法明显太简单了。
      

  9.   

    我发现了GUID也可以重码,而且相当严重:
    //=================================
    class function SEnCoding.GetGUID: string;
    var
     guid:TGUID;
    begin
      CreateGUID(guid);
      Result := GUIDToString(guid); 
    end;
    //===================================
     max := 10000;
      try
        for i:= 1 to max do
        begin
          db.FSQLQuery.SQL.Add('insert into sds_catalog( sc_ID) values('+quotedstr(SEnCoding.GetGUID)+')');
          db.FSQLQuery.ExecSQL(true);
        end;
      finally
        db.Free;
      end;大家都试试,而且重码率比我写的那个简单算法还严重