多个uniqid()调用不是唯一的

时间:2015-04-30 17:27:20

标签: php

我有一个有趣的例子,当在XAMPP本地托管时,对uniqid()的多次重复调用不会生成唯一编号。独特的id在5-20次之间重复,然后神秘地改变。

然而,作为一个有趣的转折,代码在我们的生产服务器上完美

所以这就是我正在做的事情:我正在创建一个包装器,当点击它时,通过一个简单的javascript函数隐藏/取消隐藏div中的子内容。由于可动态div是动态生成的,因此它由PHP生成的唯一ID引用。

问题的一个例子如下:

// Replace something like '[element] => <newline> (' with <a href="javascript:toggleDisplay('[unique id]');">...</a><div id="[unique id]" style="display: none;">   
$out = preg_replace_callback(
        $regex,
        function ($matches) {
            $id = uniqid();
            return $matches[1] . "<a class='debug' href='javascript:toggleDisplay(\"" . $id . "\");'>" . $matches[2] . "</a>" . "<div id='" . $id . "' style='display: none'>";
        }, $out
    );

javascript函数如下(只是这样你可以看到我在做什么;它完美地运行):

<script language="Javascript">
    function toggleDisplay(id) {
        document.getElementById(id).style.display = (document.getElementById(id).style.display == "block") ? "none" : "block";
    }
</script>'

问题是输出div都具有相同的唯一ID (!!),在5-15之间的任何位置,所以javascript不知道要引用什么div。

所以我发现了一些事情:如果我执行$id = uniqid() . rand(10000,99999)而不是$id = uniqid()之类的操作,那么代码会按预期再次运行。所以我很确定问题是uniqid()实际上并没有生成唯一ID,因为我没有覆盖或重用$id变量。

我发现了另一件有趣的事情:如果我回复microtime()以及uniqid()uniqid()只更改 microtime()发生变化时。对我而言,这感觉就像一条线索。

所以我的问题是:为什么uniqid()只有有时会生成uniqid()uniqid()是否应该生成一个唯一的数字,即使microtime()是相同的?这种行为是记录还是众所周知的?或者还有其他我想念的东西?

我问,因为我使用uniqid()感到不舒服,因为我不了解核心行为。

任何见解都将受到赞赏。谢谢。

1 个答案:

答案 0 :(得分:4)

来自uniqid()

的文档
  

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

如果您运行脚本的操作系统没有提供非常好的时钟分辨率,那么uniqid()可能会连续多次返回相同的值。

您也可以使用$id = uniqid(rand(10000,99999)),或者进一步增加随机性机会:$id = uniqid(rand(10000,99999), true)

无论如何,结论是该名称具有误导性,因为它不能保证每次调用函数时都会获得唯一值。