我写这个简单的行来获得随机&每次唯一的代码(只有8个字符):
echo substr(md5(uniqid(rand(), true)),0,8);
输出:
077331e5
5af425b1
0fc7dcf2
...
我问我是否永远不会发生碰撞(重复)。或者那可能发生。
BS:
最好使用time()
?
echo substr(md5(uniqid(time(), true)),0,8);
答案 0 :(得分:6)
哈希可能会发生碰撞。通过获取哈希的子字符串,您只是增加了发生这种情况的可能性。
答案 1 :(得分:2)
无论你向md5()提供什么,通过执行子串,你将消除md5的大部分输出并限制可能的哈希范围。 md5输出一个128位的字符串,你将它限制在32位,所以你从1x10 ^ 38到1/40亿的碰撞几率。
答案 2 :(得分:2)
您的“唯一代码”是一个由八位十六进制数字组成的字符串,因此它具有4294967296个可能的值。因此,您需要在运行它之前获得早期代码的副本。
答案 3 :(得分:1)
PHP有一种方法可以提供名为uniqid()
你很有可能你的8个字母MD5是独一无二的,但与任何随机字符串一样,你做的越短,你就越有可能发生碰撞。
答案 4 :(得分:1)
简短的回答:它可能发生。有一个关于MD5碰撞空间的讨论here,您可能想要查看。执行MD5的子串将使碰撞空间更大,更大。
更好的解决方案可能是建议的答案here,可能会根据您生成的其他唯一ID进行检查。
答案 5 :(得分:1)
您的代码返回哈希的一部分。哈希用于散列,因此您无法保证结果中的任何模式(例如,唯一性)。
此外,您只获取散列的一部分,散列中的每个字母都是十六进制的(从0
到9
或从a
到b
- 16可能性)。它只需要一个简单的计算:
16 ^ 8 = 4 294 967 296
查找代码可以生成多少个唯一值。这个数字(4 294 967 296
)意味着,如果您使用此功能的次数超过4 294 967 296次,则使用它生成的值肯定不会是唯一的。当然可以肯定的是,在这种情况下,将迭代次数应用于较小数量的值后,迭代次数将不会是唯一的。