创建一个独特的字母数字10个字符的字符串

时间:2009-01-21 23:10:23

标签: random unique

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

的确认号码
  • 独特
  • 随机外观
  • 字母数字
  • short-ish,至少比sha1
  • 返回的32个字符长的字符串短得多

我只想要约500个预订,所以我不会想象很可能会发生碰撞。

我的一个想法是根据日期时间戳和用户名生成sha1哈希,然后将其截断为前10个字符。这样的东西是否足够可靠,足以处理~500次预订?

7 个答案:

答案 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)