繁体   English   中英

PHP的唯一ID

[英]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是唯一的,但是与任何随机字符串一样,您越短越容易发生碰撞。

简短的回答:可能会发生。 有一个讨论, 在这里了您可能要检查MD5碰撞的空间。 对MD5进行子字符串处理将使碰撞空间大得多。

此处提出的答案可能是一个更好的解决方案,可能将其与您生成的其他唯一ID进行比较。

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

另外,您仅获得哈希的一部分,哈希中的每个字母均为十六进制(从09或从ab -16的可能性)。 它只需要一个简单的计算:

16 ^ 8 = 4 294 967 296

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM