我希望创建一个简单的短期预订系统,并且我希望产生确认的数字是

  • 唯一的
  • 随机的-找
  • 字母数字
  • 短期上下的,至少短得多于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字。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top