我有一个有趣的例子,当在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()一起回显,则只有在microtime()更改时,uniqid()才会更改。对我而言,这感觉像是一个线索。
那么我的问题是:为什么uniqid()有时只能生成唯一的ID?即使microtime()相同,uniqid()是否应该生成一个唯一的数字?这种行为是否有记录或广为人知?还是我还有其他遗漏的内容?
我问这个问题是因为我对使用uniqid()感到不舒服,因为我不理解其核心行为。
非常感谢您的任何见解。谢谢。
uniqid
的文档页面上,有一段红色文字说明它不会生成随机或不可预测的字符串。生成这样的字符串的选项包括使用openssl_random_pseudo_bytes
、使用放置独占锁的文件生成计数器(模拟MySQL的auto_increment
),或者通过javascript生成唯一数字(再次使用auto_increment
),或者使用MySQL通过SELECT UUID()
获取UUID等。 - N.B.uniqid
的文档中,还有一个可选的第二个参数用于测试“更多熵”。可以使用uniqid("", true);
进行测试。 - John McMahon