如何得到一个唯一的串呢,位数尽量的少

newsunet 2005-03-29 10:38:55
如题,
我写了一个,可是理论上还不是唯一的,有没有更好的办法呀:
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;
...全文
115 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
newsunet 2005-03-29
我也想把这个算法用到java中去
  • 打赏
  • 举报
回复
newsunet 2005-03-29
to aiirii:老兄,能给个算法吗
  • 打赏
  • 举报
回复
耙子 2005-03-29
GUID 重码的概率几乎为零,就是她长了点 :)
  • 打赏
  • 举报
回复
aiirii 2005-03-29
用這個:

function CreateGUID(out Guid: TGUID): HResult;

如需要,還可用這個:
function GUIDToString(const ClassID: TGUID): string;
  • 打赏
  • 举报
回复
newsunet 2005-03-29
如果是分布式的,有N个客户端,又有什么办法保证他们所产生的字符串能唯一呢
  • 打赏
  • 举报
回复
newsunet 2005-03-29

sleep(10);//
str := floattostr(double(now));
c:=pos('.',str);
str := copy(str,1,c-1)+copy(str,c+1,length(str)-c);

这就行了,那就不用随机数了,反正也是用时间作种子吗
  • 打赏
  • 举报
回复
lencon 2005-03-29
系统日期转换看看呢
  • 打赏
  • 举报
回复
newsunet 2005-03-29
这个字符串长度是固定18位,不能为了减少位数而影响质量呀,我是说还有没有别的算法呀
  • 打赏
  • 举报
回复
laiqinghe 2005-03-29
(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);

  • 打赏
  • 举报
回复
laiqinghe 2005-03-29
for j:= 1 to 18-length(str) do //把18 改成17 ????????
  • 打赏
  • 举报
回复
newsunet 2005-03-29
我发现了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;



大家都试试,而且重码率比我写的那个简单算法还严重

  • 打赏
  • 举报
回复
RamjetZhang 2005-03-29
相当建议采用GUID;
如果能限制其仅由服务器生成(并且服务器的时间能得到保证),而不依赖于客户端的话,倒是可以考虑用时间来解决;
你那个算法明显太简单了。
  • 打赏
  • 举报
回复
相关推荐
发帖
语言基础/算法/系统设计
加入

1.6w+

社区成员

Delphi 语言基础/算法/系统设计
申请成为版主
帖子事件
创建了帖子
2005-03-29 10:38
社区公告
暂无公告