Random 创建唯一的字母数字10字符字符串

Random 创建唯一的字母数字10字符字符串,random,unique,Random,Unique,我想创建一个简单的短期预订系统,我想生成一个 独特的 随意的 字母数字 short ish,至少比sha1返回的32个字符长的字符串短得多 我只想预订约500张,所以我不认为碰撞的可能性很高 我的一个想法是根据日期时间戳和用户名生成一个sha1哈希,然后将其截断为前10个字符。对于处理约500个预订而言,这样的内容是否足够独特可靠?在Perl中有一种方法可以做到这一点: 子get_random_name() { my@chars=('a'..'z','a'..'z'); 我的$random_

我想创建一个简单的短期预订系统,我想生成一个

  • 独特的
  • 随意的
  • 字母数字
  • short ish,至少比sha1返回的32个字符长的字符串短得多
我只想预订约500张,所以我不认为碰撞的可能性很高


我的一个想法是根据日期时间戳和用户名生成一个sha1哈希,然后将其截断为前10个字符。对于处理约500个预订而言,这样的内容是否足够独特可靠?

在Perl中有一种方法可以做到这一点:

子get_random_name() { my@chars=('a'..'z','a'..'z'); 我的$random_字符串

foreach(1..22) { #rand@chars将生成一个随机变量 #介于0和标量@chars之间的数字 $random_string.=$chars[rand@chars]; } 返回$random_字符串。“-”.time(); }


我不记得time()部分有多长,所以您可能需要调整数字以适应您的长度。如果不需要,也可以删除该部分。

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


只有当您希望能够为相同的输入数据重复生成相同的Id时,才需要这样做。否则,如果您生成了一个随机id,并在此之后保留,请使用Anders的建议。如果您遇到冲突,只需生成另一个冲突。

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

我只想预订约500张,所以我不认为碰撞的可能性很高


另一个愚蠢的想法是:生成1000或2000个具有所需属性的唯一随机数,将它们存储在某处,并在用户注册时将它们分配给用户:)

使用guid?16个字符,但如果你真的不在乎冲突,你可以选择前n个字符。

关于这个问题的一些好提示:


我会避免在您的字符串中包含“1”、“l”和“O”、“0”和“5”、“S”以及“Z”、“2”等字符,以便客户在需要通过电话阅读您的预订代码时更方便。该链接中提供的算法应该可以帮助您做到这一点。

如果实际只有500个,则将其中20000个预生成到一个表中,然后在需要时获取“下一个未使用的”

在C#中,您可以使用(他们说这是一种非常简单的方法)

注意,guid的子字符串根本不能保证唯一性guid算法只保证唯一性,您不能假设生成的guid是随机的,这将是用作会话id的一个要求。请参阅我是否可以建议使用base 32?如果有人需要转录这个序列,Crockford的Base32是一个非常好的选择,为什么不生成500?如果要在将来的执行中对生成器进行pickle处理,是否需要在后续执行后覆盖pickle生成器以保留值。 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(); }