[英]Unique ID with PHP
我写这行简单代码来每次都获得随机且唯一的代码(仅8个字符):
echo substr(md5(uniqid(rand(), true)),0,8);
输出:
077331e5
5af425b1
0fc7dcf2
...
我问我是否永远不会发生碰撞(重复)。 否则可能会发生。
BS:
最好使用time()
吗?
echo substr(md5(uniqid(time(), true)),0,8);
哈希可能会发生冲突。 通过获取哈希的子字符串,您只是在增加发生这种情况的机会。
不管您输入md5()的内容是什么,通过执行子字符串,您都将消除md5的大部分输出,并限制了可能的哈希范围。 md5输出一个128bit的字符串,而您将其限制为32bits,因此,发生碰撞的几率从1x10 ^ 38的1到40亿的1。
您的“唯一代码”是由八个十六进制数字组成的字符串,因此它具有4294967296个可能的值。 因此,在第4294967297次运行该命令时,您会得到一个早期代码的副本。
PHP有一种提供唯一ID的方法,称为uniqid()
您很有可能会发现8位字符MD5是唯一的,但是与任何随机字符串一样,您越短越容易发生碰撞。
您的代码返回哈希的一部分。 散列用于散列,因此您不能保证结果中的任何模式(例如,唯一性)。
另外,您仅获得哈希的一部分,哈希中的每个字母均为十六进制(从0
到9
或从a
到b
-16的可能性)。 它只需要一个简单的计算:
16 ^ 8 = 4 294 967 296
查找代码可以生成多少个唯一值。 此数字( 4 294 967 296
)表示,如果您使用此功能的次数超过4 294 967 296次,则使用它生成的值肯定不会唯一 。 当然可以肯定的是,在这种情况下,将迭代次数应用于较小数量的值后,迭代次数将不是唯一的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.