我有一个有趣的例子,当在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()
感到不舒服,因为我不了解核心行为。
任何见解都将受到赞赏。谢谢。
答案 0 :(得分:4)
来自uniqid()
的文档警告此功能不会创建随机字符串或不可预测字符串。 此功能不得用于安全目的。使用加密安全随机函数/生成器和加密安全散列函数来创建不可预测的安全ID。
如果您运行脚本的操作系统没有提供非常好的时钟分辨率,那么uniqid()可能会连续多次返回相同的值。
您也可以使用$id = uniqid(rand(10000,99999))
,或者进一步增加随机性机会:$id = uniqid(rand(10000,99999), true)
。
无论如何,结论是该名称具有误导性,因为它不能保证每次调用函数时都会获得唯一值。