【发布时间】:2009-01-21 23:10:22
【问题描述】:
我正在寻找创建一个简单的短期预订系统,并且我想生成确认号码
- 独一无二的
- 随机外观
- 字母数字
- 短,至少比 sha1 返回的 32 个字符长的字符串短得多
我只希望有大约 500 个预订,所以我不想象碰撞的可能性很大。
我的一个想法是根据日期时间戳和用户名生成一个 sha1 哈希,然后将其截断为前 10 个字符。对于处理约 500 个预订的目的,这样的东西是否足够可靠?
【问题讨论】:
我正在寻找创建一个简单的短期预订系统,并且我想生成确认号码
我只希望有大约 500 个预订,所以我不想象碰撞的可能性很大。
我的一个想法是根据日期时间戳和用户名生成一个 sha1 哈希,然后将其截断为前 10 个字符。对于处理约 500 个预订的目的,这样的东西是否足够可靠?
【问题讨论】:
SHA-1 哈希的任何给定位的随机性应该没有区别,所以这是可能的。另一种方法是使用 XOR 将哈希折叠到自身中,直到您拥有 60 位的数据,然后使用 Base 64 对其进行编码以获得主要是字母数字的结果。
仅当您希望能够为相同的输入数据重复生成相同的 Id 时,才需要这样做。否则,如果您生成一次随机 id 并在此之后保留,请使用 Anders 的建议。如果发生冲突,只需生成另一个冲突。
【讨论】:
你可以使用任何东西,甚至是一个普通的随机数生成器;但是,您应该检查预订代码是否已存在。如果是这种情况,请在字符串 (date+user) 中添加字符 ('x'),直到获得新的 random/sha1/etc。
我只希望有大约 500 个预订,所以我认为冲突的可能性不大。
另一个愚蠢的想法:生成 1000 或 2000 个具有所需属性的唯一随机数,将它们存储在某个地方,并在用户注册时将它们分配给用户 :)
【讨论】:
这是在 Perl 中执行此操作的一种方法:
sub 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 个预先生成到一个表中,然后在需要时获取“下一个未使用的”。
【讨论】:
关于这个问题的一些好技巧:How do I create a random alpha-numeric string in C++?
我会避免在字符串中包含“1”、“l”和“O”、“0”和“5”、“S”和“Z”、“2”等字符当客户需要通过电话读取您的预订代码时,他们会更容易。该链接上提供的算法应该可以帮助您做到这一点。
【讨论】:
使用向导? 16个字符,如果你真的不关心碰撞,你可以选择前n个字符。
【讨论】:
【讨论】: