我正在寻找创建一个简单的短期预订系统,我想生成
的确认号码我只想要约500个预订,所以我不会想象很可能会发生碰撞。
我的一个想法是根据日期时间戳和用户名生成sha1哈希,然后将其截断为前10个字符。这样的东西是否足够可靠,足以处理~500次预订?
答案 0 :(得分:4)
SHA-1散列的任何给定位的随机性应该没有区别,所以这是可能的。另一种方法是使用XOR将散列折叠到自身,直到你有60位的数据,然后使用Base 64对其进行编码,以获得主要的字母数字结果。
仅当您希望能够为相同的输入数据重复生成相同的Id时,才需要这样做。否则,如果您生成一次随机ID,并在此之后保留,请使用Anders的建议。如果您遇到冲突,只需再生一个。
答案 1 :(得分:3)
你可以使用任何东西,甚至是普通的随机数发生器;但是,您应该检查预订代码是否已经存在。如果是这种情况,请在字符串(日期+用户)中添加字符('x'),直到获得新的random / sha1 / etc。
我只想要约500个预订,所以我不认为有很大的可能性。
另一个愚蠢的想法:生成1000或2000个具有所需属性的唯一随机数,将它们存储在某处,并在注册时将它们分配给用户:)
答案 2 :(得分: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 :(得分:2)
如果它真的只有500,那么将它们预先生成20,000个放入表中,然后在需要时获得“下一个未使用的”。
答案 4 :(得分:1)
有关此问题的一些好建议:How do I create a random alpha-numeric string in C++?
我要避免在字符串中包含“1”,“l”,“O”,“0”和“5”,“S”,“Z”,“2”等字符,以使其成为可能客户需要通过电话阅读预订代码时更容易。该链接上显示的算法可以帮助您实现此目的。
答案 5 :(得分:0)
使用guid? 16个字符,但如果你真的不关心碰撞,你可以选择前n个字符。
答案 6 :(得分:0)