具有更多熵的 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)
sh 使用xz创建具有任意名称的文件的压缩副本,保留源文件。
centos7下安装docker(25docker swarm---replicated mode&global mode)