2012-04-15 175 views
1

可能重复:
PHP: How to generate a random, unique, alphanumeric string?如何在PHP中生成一个唯一的数字ID?

请问这个公式产生冲突?

substr(md5(uniqid(rand()))),0,6) 

如何仅用数字(即7位数字)生成唯一ID?

+5

如果您只想要数字并且希望避免冲突,唯一的方法是使用自动增量值。任何随机值将有足够的时间和足够大的样本的冲突的可能性。 – 2012-04-15 12:10:29

+0

在您的情况下,生成超过1000万个ID将会导致100%的冲突:) – nico 2012-04-15 12:11:40

+2

这个网站上的其他类似问题都没有帮助吗? – DanMan 2012-04-15 12:12:00

回答

1

uniqid生成一个13个字符的字符串,如何将它减少到7个字符或7位数字没有碰撞风险?

只要你的意思碰撞而调换的uniqid输出到一个新的表示,你可以做如下所示:

  • uniqid返回13个字符的字符串,每个字符可以是0-9a-f ,所以基本上是一个十六进制数字,一个地方,0-15十进制。
  • 正如如果取两个那些可以转化为在从0到255范围内的一个字符或数字,它很容易降低13点0-15的值到7个0-255值:

实施例:

$unique = uniqid(); # 13 characters 
$sevenPairs = array_map('hexdec', str_split($unique, 2)); 
printf("Unique ID: %s\nSeven Pairs (digits): %s\n" 
     , $unique, implode(', ', $sevenPairs)); 

输出:

Unique ID: 4f8ace1eb736a 
Seven Pairs (digits): 79, 138, 206, 30, 183, 54, 10 

要小心,如果你使用前缀部的(在你的问题你使用rand),该retur的长度ned string by uniqid可以大于13.

+0

如果我为每个数字N mod 10获得一个介于0和999999之间的数字,但是这个数字总是唯一的! ? – Bertaud 2012-04-15 22:13:45

+0

我不明白你的意思。 – hakre 2012-04-15 22:27:51

+0

我想将您的七对数字转换成七位数字 – Bertaud 2012-04-16 10:35:40

0

最简单的方法是从数据库或文本文件中获取数据,从0开始,每个ID增加1。

$id = strint(file_get_contents('counter.txt')); 
file_put_content('counter.txt',++$id); 

使用rand()时,您将有更大的机会获得相同的数字。 如果您不想要增量值,请使用rand并检查数字是否已用于数据库。