具有更多熵的 uniqid() 创建副本有多容易?

Posted

技术标签:

【中文标题】具有更多熵的 uniqid() 创建副本有多容易?【英文标题】:How easily will uniqid() with more entropy create a duplicate? 【发布时间】:2016-09-20 20:22:39 【问题描述】:

这可能是一个离题的问题,但我希望有人能回答这个问题。

具有更多熵的 uniqid() 以多少纳秒、毫秒或秒计算会产生重复的风险?

参考下面的链接,如果在一毫秒内创建了两个 id,uniqid 将发生冲突。更多的熵呢?

(我的目标是在创建时使用一个小的可索引字母数字字符串作为文档 ID,它可以在没有 db 干扰的情况下以最小的处理器功率快速创建。)

这里的答案似乎没有提供任何确切的数字: How unique is uniqid?

【问题讨论】:

这可能是一个题外话,但你看过 uuid v4 吗? ***.com/a/15875555/4099089 实际上uniqid 没有more_entropy 会执行usleep(1) 所以它永远不会返回相同的值两次(无论如何,在同一个线程中):github.com/php/php-src/blob/… 也就是说,如果重复 ID 存在严重风险,您可能不应该使用 uniqid。如果不是,只需检测重复项并从中恢复。 @Tgr 请考虑添加您的 cmets 作为答案。将其标记为问题中主要问题的答案。 【参考方案1】:

从source code 开始,more_entropy 添加了九个随机十进制数字,因此您可以预期在大约 37,000 次调用后会发生冲突。 (关于 10 亿如何变成 37,000,请参阅 birthday attack。)这当然忽略了这样一个事实,即这些数字实际上不是随机的,而是由 LCG 生成的,并且代码中的其他地方可能使用了相同的 LCG ,所以实际发生碰撞的几率可能更高(具体有多少,我不知道)。

另外值得注意的是,uniqid 实际上并不能保证微秒级分辨率,因为某些 PHP 实现(特别是 Windows)无法访问微秒级精度的时钟。

简而言之,如果您需要为任何安全敏感的事物提供唯一 ID,或者冲突代价高昂,请避免使用 uniqid。否则,将它与more_entropy 一起使用可能没问题(尽管常见的模式是使用uniqid(mt_rand(), true) 来添加更多额外的熵)。

【讨论】:

以上是关于具有更多熵的 uniqid() 创建副本有多容易?的主要内容,如果未能解决你的问题,请参考以下文章

打开文件时将文件的副本保存在特定文件夹中

replicated vs global mode - 每天5分钟玩转 Docker 容器(105)

为啥堆栈必须是页面对齐的?

您猜出可能生成的 GUID 有多容易?

sh 使用xz创建具有任意名称的文件的压缩副本,保留源文件。

centos7下安装docker(25docker swarm---replicated mode&global mode)