代码之家  ›  专栏  ›  技术社区  ›  GordonM

uniqid有多独特?

php
  •  72
  • GordonM  · 技术社区  · 14 年前

    这个问题其实不是寻找解决方案的问题,更多的只是一个简单的好奇心问题。PHP uniqid函数有一个更大的熵标志,使输出“更独特”。这让我想知道,当更多的熵是真的时,这个函数产生相同结果的可能性有多大。换句话说,当更多的熵被启用时,与被禁用时相比,uniqid有多独特?一直启用更多的熵有什么缺点吗?

    5 回复  |  直到 14 年前
        1
  •  35
  •   Lucas Dynelight    10 年前

    更新,2014年3月:

    uniqid 有点用词不当,因为它不能保证唯一的ID。

    根据 PHP documentation :

    警告!

    此函数不创建随机或不可预测的字符串。这个 函数不能用于安全目的。加密使用 创建不可预测的安全ID的函数。

    以及

    不传递任何附加参数的事实返回值 与 microtime() 加密安全令牌使用 openssl_random_pseudo_bytes() .


    根据文档,将more entropy设置为true会生成一个更为唯一的值,但是执行时间会更长(尽管程度很小):

    组合线性同余生成器)在返回的末尾 值,这将增加结果唯一的可能性。

    注意这一行 increases the likelihood that the result will be unique 但那不是威尔 保证

    在某种程度上,您可以“无休止”地追求唯一性,并使用任意数量的加密例程来增强,添加 salts 诸如此类——这取决于目的。

    我建议查看关于主要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
  •  15
  •   danp    14 年前

    只有当你检查它们已经不存在的时候,它们才是唯一的。不管你用什么函数来生成一个“随机”字符串,或者ID,如果你不仔细检查它是否是重复的,那么总是有机会的。。;)

    虽然uniqid是基于当前时间的,但上面的警告仍然适用——这取决于您将在何处使用这些“唯一id”。所有这一切的线索就是它所说的“更加独特”。独一无二就是独一无二。你怎么能有一些或多或少的独特,是有点困惑我!

    如上所述进行检查,并将所有这些内容组合在一起,将使您最终获得接近唯一性的结果,但这一切都与密钥的使用位置和上下文有关。希望能有帮助!

        3
  •  10
  •   Michael Borgwardt    14 年前

    从PHP手册站点上关于函数的讨论:

    如下文所述,无前缀 函数只返回UNIX 作为十六进制数的计数器;它是 更小的微时间(),以HeIIT形式。

    另外值得注意的是,由于microtime()只在gettimeofday()存在的系统上工作,而Windows本机不存在,因此uniqid()在Windows环境中可能只产生一秒分辨率的UNIX时间戳。

    换言之,如果没有“更多的熵”,这个函数是绝对可怕的,永远不应该使用。根据文档,该标志将使用“组合线性同余生成器”来“添加熵”。嗯,那是一个相当弱的RNG。所以我完全跳过这个函数,使用基于 mt_rand 对与安全无关的事情要有好的种子,对与安全无关的事情要有SHA-256。

        4
  •  7
  •   Reese Moore    14 年前

    从那里开始,这是一个可能性有多大的问题。答案是,不是很好,但不是到了一个可折的程度。如果你 需要

        5
  •  4
  •   Tgr    9 年前

    相关位来自 the source code

    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 添加九个稍微随机的十进制数字( php_combined_lcg() 返回值 (0,1)

    推荐文章