uniqid有多独特?

这个问题不是寻找解决scheme的真正问题,更多的只是一个简单的好奇心问题。 PHP uniqid函数有一个更多的熵标志,使输出“更独特”。 这使我想知道,当more_entropy为true时,这个函数有多less可能产生相同的结果,而不是这种情况。 换句话说,当启用more_entropy时,与何时禁用相比,uniqid有多独特? 是否有任何缺点,一直启用more_entropy?

更新,2014年3月:

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

根据PHP文档 :

警告!

这个函数不会创build随机或不可预知的string。 此function不得用于安全目的。 使用密码安全的随机函数/生成器和密码安全的哈希函数来创build不可预知的安全ID。

这个函数不会生成encryption安全的令牌,事实上,如果不传递任何附加参数,返回值与microtime()几乎是不同的。 如果您需要生成密码安全令牌,请使用openssl_random_pseudo_bytes() 。


设置更多的熵为真会产生一个更独特的价值,但执行时间更长(尽pipe很小程度),根据文档:

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

注意这条线increases the likelihood that the result will be unique而不是保证唯一性。

你可以“无休止地”争取唯一性,达到一定程度,并且使用任意数量的encryption程序,join盐类等等,这取决于目的。

我build议看看主要的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

我推荐的是为什么你需要唯一性,这是为了安全(即添加到encryption/加扰程序)? 另外,它有多独特呢? 最后,看速度考虑。 适用性将随着潜在的考虑而改变。

如果你检查它们不存在的话,事情是唯一的。 使用什么函数来生成一个“随机”string或ID并不重要,如果你不仔细检查它是不是重复的,那么总是有这个机会。

虽然uniqid是基于当前时间,上述警告仍然适用 – 这取决于您将在哪里使用这些“唯一的ID”。 所有这一切的线索是“更独特”的地方。 独特是独一无二的。 你怎么能有一些或多或less独特的东西,有点让我困惑!

如上所述,将所有这些东西结合在一起,可以让你的东西接近唯一性,但是它的全部都是相对于键的使用和上下文的。 希望有所帮助!

从关于PHP手册网站的function的讨论:

正如下面其他人所注意到的,没有前缀和没有“增加熵”,这个函数简单地返回带有微秒计数器的UNIX时间戳作为hex数; 它或多或less只是microtime(),以六进制forms。

[…]

另外值得注意的是,由于microtime()仅适用于具有gettimeofday()>的系统,而Windows本身并不支持,所以uniqid()可能会在Windows环境中产生一秒钟parsing的UNIX时间戳。

换句话说,如果没有“更多的熵”,这个函数是绝对可怕的,不应该被使用。 根据文档,该标志将使用“组合线性同余发生器”来“添加熵”。 那么,这是一个相当薄弱的RNG。 所以我会完全跳过这个函数,并且使用基于mt_rand的东西,这个东西不是安全相关的,而SHA-256是用来处理事情的。

如果没有more_unique标志,它将返回一个微秒计数器的unix时间戳,因此,如果两个调用在同一微秒进行,那么它们将返回相同的“唯一”标识。

从那里,这是一个多么可能的问题。 答案是,不是,但不是一个可低估的程度。 如果你需要一个唯一的ID并且经常生成它们(或者使用其他地方生成的数据),不要指望它是绝对唯一的。

源代码的相关位是

 if (more_entropy) { uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10); } else { uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec); } 

所以more_entropy增加了9个有点随机的十进制数( php_combined_lcg()返回一个值在(0,1) ) – 这是29.9比特的熵,实际上可能less于LCG不是一个密码安全的伪随机数发生器。