uniqid有多独特?

php
2022-08-30 08:31:04

这个问题并不是一个寻找解决方案的问题,它更多的只是一个简单的好奇心问题。PHP uniqid函数具有更多的熵标志,以使输出“更独特”。这让我想知道,当more_entropy为真时,此函数产生相同结果的可能性有多大,而不是当它不是真时。换句话说,启用more_entropy时,与禁用时,uniqid 的唯一性如何?始终启用more_entropy有什么缺点吗?


答案 1

2014 年 3 月更新:

首先,重要的是要注意这有点用词不当,因为它不能保证唯一的ID。uniqid

根据 PHP 文档

警告!

此函数不会创建随机或不可预测的字符串。此函数不得用于安全目的。使用加密安全随机函数/生成器和加密安全哈希函数来创建不可预测的安全 ID。

此函数不会生成加密安全的令牌,实际上,无需传递任何其他参数,则返回值与microtime()几乎没有区别。如果需要生成加密安全的令牌,请使用 openssl_random_pseudo_bytes()。


根据文档,将更多熵设置为 true 会生成更独特的值,但是执行时间更长(尽管程度很小):

如果设置为 TRUE,uniqid() 将在返回值的末尾添加额外的熵(使用组合的线性同余生成器),这增加了结果唯一的可能性。

请注意该行,而不是将保证唯一性。increases the likelihood that the result will be unique

您可以“无休止地”争取独特性,直到一定程度,并使用任意数量的加密例程进行增强,添加等 - 这取决于目的。

我建议看看关于主要PHP主题的评论,特别是:

http://www.php.net/manual/en/function.uniqid.php#96898

http://www.php.net/manual/en/function.uniqid.php#96549

http://www.php.net/manual/en/function.uniqid.php#95001

我建议的是弄清楚为什么你需要唯一性,是为了安全性(即添加到加密/加扰例程)?另外,它需要独特?最后,看看速度考虑。适用性将随着潜在的考虑而变化。


答案 2

只有当您检查它们尚不存在时,事物才是唯一的。使用什么函数来生成“随机”字符串或ID并不重要 - 如果您不仔细检查它不是重复的,那么总有机会。;)

虽然uniqid基于当前时间,但上面的警告说明仍然适用 - 它只是取决于您将使用这些“唯一ID”的位置。所有这一切的线索是它说“更独特”的地方。独一无二就是独一无二。你怎么能拥有或多或少独特的东西,这对我来说有点令人困惑!

如上所述检查,并结合所有这些东西会让你最终得到一些接近唯一性的东西,但它都是相对于使用键的位置和上下文而言的。希望有所帮助!


推荐