Является ли временная метка в микросекундах всегда уникальной?

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 хорошо подходят (потому что они были разработаны для этой цели).

Спросите себя, почему вам нужно униид в первую очередь. Например, я использую uniquid как имя файла загрузок на мой сайт. Может быть любое количество пользователей, которые загружаются одновременно, поэтому я имею в виду два или более файла с одинаковым идентификатором, НО я знаю, что один пользователь может загружать только один файл за раз. Итак, я предваряю имя пользователя впереди и всегда буду иметь уникальность.

 echo uniqid('username-'); // username-5621e3335ac0c 

Конечно, вы всегда должны спрашивать себя, нужно ли вам в первую очередь использовать нежидко. Если вы знаете причину, по которой вы создаете идентификатор, это может произойти только каждые x секунд, минут и т. Д., Тогда вы можете создать id таким же образом, просто используйте время:

 echo 'username-'.time(); // username-1445062025