我正在寻找创建一个简单的短期预订系统,我想生成确认号码
- 独特
- 随机的
- 字母数字
- 短,至少比 sha1 返回的 32 个字符长的字符串短得多
我只希望有大约 500 个预订,所以我不认为碰撞的可能性很大。
我的一个想法是根据日期时间戳和用户名生成一个 sha1 哈希,然后将其截断为前 10 个字符。对于处理约 500 个预订的目的,这样的东西是否足够可靠?
SHA-1 哈希的任何给定位的随机性应该没有区别,所以这是可能的。另一种方法是使用 XOR 将哈希折叠到自身中,直到您拥有 60 位的数据,然后使用Base 64对其进行编码以获得主要是字母数字的结果。
仅当您希望能够为相同的输入数据重复生成相同的 Id 时,才需要这样做。否则,如果您生成一次随机 id,并在此之后保留,请使用 Anders 的建议。如果您遇到冲突,只需生成另一个。
你可以使用任何东西,甚至是一个普通的随机数生成器;但是,您应该检查预订代码是否已存在。如果是这种情况,请在字符串 (date+user) 中添加字符 ('x'),直到获得新的 random/sha1/etc。
我只希望有大约 500 个预订,所以我不认为碰撞的可能性很大。
另一个愚蠢的想法:生成 1000 或 2000 个具有所需属性的唯一随机数,将它们存储在某个地方,并在用户注册时将它们分配给用户 :)
这是在 Perl 中执行此操作的一种方法:
子 get_random_name() { 我的@chars=('a'..'z','A'..'Z'); 我的 $random_string;foreach (1..22) { # rand @chars 会随机生成一个 # 介于 0 和标量之间的数字 @chars $random_string .= $chars[rand @chars]; } 返回 $random_string 。“-”。时间(); }
我不记得 time() 部分有多长,因此您可能需要调整数字以适合您的长度。如果不需要,也可以删除该部分。
如果真的只有 500 个,那么将其中的 20,000 个预先生成到一个表中,然后在需要时获取“下一个未使用的”。
关于这个问题的一些好的提示:如何在 C++ 中创建随机字母数字字符串?
我会避免在您的字符串中包含“1”、“l”和“O”、“0”和“5”、“S”和“Z”、“2”等字符,以方便客户使用当他们需要通过电话读取您的预订代码时。该链接上提供的算法应该可以帮助您做到这一点。
使用指南?16 个字符,不过如果你真的不关心碰撞,你可以选择前 n 个字符。
在 C# 中,您可以使用http://www.dotnetfunda.com/forums/thread1357-how-do-generate-unique-alpha-numeric-random-number-in-aspnet.aspx(他们说超级简单的方法)