У меня есть интересный пример, когда несколько повторных вызовов uniqid()
не генерируют уникальные номера при локальном размещении на XAMPP. Уникальный идентификатор повторяется где-то между 5-20 раз и затем таинственно изменяется.несколько вызовов uniqid() не являются уникальными
Однако, как интересный поворот, код работает отлично на нашем производственном сервере.
Итак, вот что я делаю: Я создаю оболочку, которая при щелчке скрывает/скрывает дочерний контент в div через простую функцию javascript. Поскольку скрываемый div генерируется динамически, на него ссылается уникальный идентификатор, который генерируется PHP.
Пример вопроса заключается в следующем:
// 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>'
Проблема в том, что выходные divs имеют одинаковый уникальный идентификатор (!!), в кластерах где-то между 5-15, поэтому javascript не знает, какой div ссылаться.
Таким образом, некоторые вещи, которые я нашел: Если я что-то вроде $id = uniqid() . rand(10000,99999)
вместо того, чтобы просто $id = uniqid()
то код снова работает как задумано. Поэтому я уверен, что проблема в том, что uniqid()
фактически не генерирует уникальный идентификатор, учитывая, что я не переписываю или повторно использую переменную $id
.
Еще одна интересная вещь, которую я нашел: если я выводящая ее microtime()
вместе с uniqid()
, то uniqid()
изменяет только, когда microtime()
изменения. Для меня это похоже на подсказку.
Так что мой вопрос: Почему бы uniqid()
только иногда генерировать uniqid()
? Разве не uniqid()
должен генерировать уникальный номер, даже если microtime()
- это то же самое? Является ли это поведение документированным или хорошо известным? Или есть что-то еще, что мне не хватает?
Я прошу, потому что я чувствую себя некомфортно, используя uniqid()
, потому что я не понимаю поведение ядра.
Любое понимание будет оценено по достоинству. Спасибо.
На странице документации для 'uniqid' есть красный текст, в котором говорится, что он не генерирует случайные или непредсказуемые строки. Параметры для его создания используются с помощью 'openssl_random_pseudo_bytes', используя счетчик, созданный путем размещения исключительной блокировки файла, который содержит целое число, которое вы увеличиваете (эмулируете MySQL' auto_increment') или генерируете уникальный номер (снова auto_increment) через javascript, используя MySQL для получения UUID через 'SELECT UUID()' и т. д. –
Также в документах для 'uniqid' есть необязательный второй параметр для« большей энтропии », который вы можете проверить.'uniqid (" ", true);' –
Я не думаю, что он ожидает, что они будут случайными или непредсказуемыми. Просто, чтобы не было дубликатов. – Barmar