PHP的唯一ID

时间:2011-05-17 18:21:58

标签: php random

我写这个简单的行来获得随机&每次唯一的代码(只有8个字符):


echo substr(md5(uniqid(rand(), true)),0,8);

输出:

077331e5
5af425b1
0fc7dcf2
...

我问我是否永远不会发生碰撞(重复)。或者那可能发生。

BS:
最好使用time()


echo substr(md5(uniqid(time(), true)),0,8);

6 个答案:

答案 0 :(得分:6)

哈希可能会发生碰撞。通过获取哈希的子字符串,您只是增加了发生这种情况的可能性。

答案 1 :(得分:2)

无论你向md5()提供什么,通过执行子串,你将消除md5的大部分输出并限制可能的哈希范围。 md5输出一个128位的字符串,你将它限制在32位,所以你从1x10 ^ 38到1/40亿的碰撞几率。

答案 2 :(得分:2)

您的“唯一代码”是一个由八位十六进制数字组成的字符串,因此它具有4294967296个可能的值。因此,您需要在运行它之前获得早期代码的副本。

答案 3 :(得分:1)

PHP有一种方法可以提供名为uniqid()

的唯一ID

你很有可能你的8个字母MD5是独一无二的,但与任何随机字符串一样,你做的越短,你就越有可能发生碰撞。

答案 4 :(得分:1)

简短的回答:它可能发生。有一个关于MD5碰撞空间的讨论here,您可能想要查看。执行MD5的子串将使碰撞空间更大,更大。

更好的解决方案可能是建议的答案here,可能会根据您生成的其他唯一ID进行检查。

答案 5 :(得分:1)

您的代码返回哈希的一部分。哈希用于散列,因此您无法保证结果中的任何模式(例如,唯一性)。

此外,您只获取散列的一部分,散列中的每个字母都是十六进制的(从09或从ab - 16可能性)。它只需要一个简单的计算:

16 ^ 8 = 4 294 967 296

查找代码可以生成多少个唯一值。这个数字(4 294 967 296)意味着,如果您使用此功能的次数超过4 294 967 296次,则使用它生成的值肯定不会是唯一的。当然可以肯定的是,在这种情况下,将迭代次数应用于较小数量的值后,迭代次数将不会是唯一的。