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


Uniqid() в PHP генерирует уникальный идентификатор на основе текущей метки времени в микросекундах. Действительно ли это надежный способ сгенерировать уникальный идентификатор?

Даже если предположить, что один пользователь запускает один скрипт с циклом, генерирующим метку времени в микросекундах, может ли все еще быть теоретическая гарантия того, что это не соответствует действительности? И на практике, является ли вероятность полностью ничтожной?

Для ясности скажите, что ваш цикл - это не что иное, как это:

foreach($things as $thing){
    var_dump(microtime());
}

Есть ли любой теоретический шанс, что это может быть не уникально, и если да, то насколько это реально на практике?

Author: vanamerongen, 2014-11-12

2 answers

Идентификаторы, основанные на микросекундах, гарантированно уникальны только в определенных пределах. Однопоточные сценарии на одном компьютере, вероятно, довольно безопасны в этом отношении. Однако, как только вы начинаете говорить о параллельном выполнении, будь то просто на нескольких процессорах на одной машине или особенно на нескольких машинах, все ставки отменяются.

Так что это зависит от того, для чего вы хотите использовать этот идентификатор. Если вы просто используете его для создания идентификатора, который используется только в одном и том же сценарии, это вероятно, достаточно безопасно. Например:

<?php $randomId = uniqid(); ?>
<div id="<?php echo $randomId; ?>"></div>
<script>
    var div = document.getElementById('<?php echo $randomId; ?>');
    ...
</script>

Вы, скорее всего, не столкнетесь здесь с какими-либо проблемами при таком ограниченном использовании.

Однако, если вы начнете генерировать имена файлов с помощью uniqid или других подобных применений, которые используются совместно с другими внешними сценариями, я бы не стал на это полагаться. Для имен файлов может быть хорошей идеей использовать хэш, основанный на содержимом файла. Для децентрализованных случайно сгенерированных идентификаторов общего назначения UUID хорошо подходят (потому что они были разработаны для этого цель).

 6
Author: deceze, 2014-11-12 09:05:28

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

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

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

echo 'username-'.time(); // username-1445062025
 0
Author: user756659, 2015-10-17 06:14:57