2009-01-21 119 views
7

我希望创建一个简单的短期的预订系统,我想产生是创建一个唯一的字母数字10个字符的字符串

  • 独特
  • 随机找
  • 确认号码
  • 字母数字
  • 短十岁上下,至少要比短32字符的长字符串的SHA1返回

我只是期待有〜500保留,所以我不想象 collistan的可能性很高。

我的一个想法是基于日期时间戳和用户名生成sha1散列,然后将其截断为前10个字符。这样的事情是否足够可靠地处理约500个预订?

回答

4

SHA-1散列的任何给定位的随机性应该没有区别,所以这是可能的。另一种方法是使用XOR将哈希折叠到自身中,直到获得60位数据,然后使用Base 64对其进行编码以获得大部分字母数字结果。

只有当您希望能够为相同的输入数据重复生成相同的ID时,才需要这样做。否则,如果您生成一次随机ID,然后坚持使用安德斯的建议。如果发生冲突,只需生成另一个冲突。

+2

我可以建议基地32呢?如果任何人不得不抄录这个序列,Crockford的Base32是一个非常优越的选择http://crockford.com/wrmg/base32.html – Breton 2009-01-22 00:06:30

2

这里是做在Perl一种方式:

sub get_random_name() 
{ 
    my @chars=('a'..'z','A'..'Z'); 
    my $random_string;

foreach (1..22) { # rand @chars will generate a random # number between 0 and scalar @chars $random_string .= $chars[rand @chars]; } return $random_string . "-" . time(); }

我不记得时间()部分是如何长,所以你可能需要调整数量以满足您的长度。如果你不需要它,你也可以删除那部分。

3

你可以使用任何东西,即使是一个普通的随机数发生器;但是,您应该检查预订代码是否已经存在。如果是这种情况,请在字符串(日期+用户)中添加字符('x'),直到获得新的随机/ sha1/etc。

我只是希望有500个预约,所以我不会想象出大概的几率。

另一种愚蠢的想法:产生1000张或2000具有所需性能独特的随机数,存储它们的地方,并将它们分配给用户,因为他们注册:)

0

使用GUID? 16个字符,但如果你真的不关心碰撞,你可以选择前n个字符。

+0

请注意,GUID的子字符串不保证完全是唯一的http:///blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx – Eclipse 2009-01-21 23:56:33

+0

guid算法仅保证唯一性,您不能假定生成的guid是随机的,这是使用作为会话ID。 – 2009-01-22 00:19:28

1

在这个问题上有一些很好的建议:How do I create a random alpha-numeric string in C++?

我会避免包括像 “1”, “L” 和 “O”, “0” 和 “5”, “S” 和“字Z“,”2“,以便客户在需要通过电话阅读预订代码时更方便。在该链接中呈现的算法应该可以帮助您做到这一点。

2

如果它真的只有500个,那么预先生成其中的20,000个到表中,然后在需要时获取“下一个未使用的”。

相关问题