uniqid () в PHP генерирует уникальный идентификатор на основе текущей временной метки в микросекундах. Это действительно надежный способ создать уникальный идентификатор?
Даже если предположить, что один пользователь запускает один сценарий с циклом, генерирующим временную метку в микросекундах, может ли все еще быть теоретическая гарантия того, что это не так? И практически ли вероятность совершенно незначительна?
Для ясности, скажем, ваш цикл — не более чем это:
foreach($things as $thing){
var_dump(microtime());
}
есть ли теоретический шанс, что он может быть не уникальным, и если да, то насколько он реалистичен на практике?
Идентификаторы на основе микросекунд гарантированно будут уникальными только в определенных пределах. Однопоточные скрипты на одном компьютере, вероятно, довольно безопасны в этом отношении. Однако, как только вы начнете говорить о параллельном выполнении, будь то просто на нескольких процессорах в пределах одной машины или, особенно, на нескольких машинах, все ставки отключены.
Так что это зависит от того, для чего вы хотите использовать этот идентификатор. Если вы просто используете его для генерации идентификатора, который используется только в одном и том же скрипте, это, вероятно, достаточно безопасно. Например:
<?php $randomId = uniqid(); ?>
<div id="<?php echo $randomId; ?>"></div>
<script>
var div = document.getElementById('<?php echo $randomId; ?>');
...
</script>
С этим ограниченным использованием вы, скорее всего, не столкнетесь с какими-либо проблемами.
Однако, если вы начнете генерировать имена файлов, используя uniqid
или другое такое использование, которое совместно используется с другими внешними сценариями, я бы не стал на это полагаться Для имен файлов хорошей идеей может быть использование хэша на основе содержимого файла. Для общих целей децентрализованных случайно сгенерированных идентификаторов, UUID, хорошо подходят (потому что они были разработаны для этой цели).
Спросите себя, зачем вам нужен uniqid? Например, я использую uniquid в качестве имени файла для загрузки на мой сайт. Может быть любое количество пользователей, которые загружают одновременно, поэтому меня интересуют два или более файлов с одинаковым идентификатором, НО я знаю, что один пользователь может загружать только один файл за раз. Итак, я добавляю имя пользователя впереди и всегда буду иметь уникальность.
echo uniqid('username-'); // username-5621e3335ac0c
Конечно, вы всегда должны спросить себя, нужно ли вам использовать uniquid в первую очередь. Если вы знаете, что причина создания идентификатора может происходить только каждые x секунд, минут и т. Д., То вы можете создать идентификатор таким же образом, просто используя время:
echo 'username-'.time(); // username-1445062025