题
我希望创建一个简单的短期预订系统,并且我希望产生确认的数字是
- 唯一的
- 随机的-找
- 字母数字
- 短期上下的,至少短得多于32个字符长串返回的sha1
我只是希望有-500人的保留,所以我不 想象一下 高情形产生的collissions.
一个想法我有的是产生一个sha1hash基于上一日期时间邮票和用户名,那么截断其第10字符。会这样的东西可靠独特的足够的目的,处理约500预约吗?
解决方案
不应有任何差异的随机性的任何给定点SHA-1散,因此是可能的。另一种方式是放弃的散列入本身的使用XOR直到你有60位价值数据,然后进行编码,它使用 基64 得到一个主要的字母数字结果。
这仅仅是必要的,如果你想要能够产生相同的Id重复为相同的输入数据。否则,如果一个随机的标识生成一次,并举行之后,使用安德斯*'的建议。如果你得到一个冲突,就产生一个又一个。
其他提示
你可以使用无论如何,即使是一个普通的随机数发生器;但是,应检查保留的代码不是已经存在。如果是这种情况下,添加文字("x")的string(日期+用户),直到你得到一个新的随机/sha1/等。
我只是希望有-500人的保留,所以我不想象一下高的情形产生的collissions.
另一个愚蠢的想法:产生1000或2000年唯一的随机数量与所需的特性、储存他们的地方,并将它们分配给用户,因为他们注册:)
这里是做到这一点的方法之一在Perl:
sub get_random_name() { my @chars=('a'..'z','A'..'Z'); my $random_string;foreach(1..22) { #兰@chars将产生一个随机的 #之间的数字在0和标@chars $random_string.= $chars[兰@chars];} return$random_string."-".时间();}
我不记得多久的时间()部分,所以你可能需要调整数字,以适合你的长度。你也可以删除,部分如果你不需要它。
如果这真的只是500,然后前产生20,000他们,到一个表格,然后得到的"下一个未使用的一个"当你需要它。
一些很好的提示这个问题: 我如何创建一个随机的字母数字符串在C++?
我会避免包括人物,如"1","l","O"、"0"和"5","S"和"Z","2"在你的串,以使其更易于客户时,他们需阅读你的保留码在电话。算法提出了在这一链接,应该帮助你做到这一点。
使用guid?16字,虽然如果你真的关心不碰撞,你只能选择的第n字。