Уникальность: `time ()` Vs `mt_rand ()` - PullRequest
1 голос
/ 27 ноября 2011

Я всегда не могу быть уверен в этом, когда приходится генерировать уникальный номер в php.

Является ли time() более уникальным, чем mt_rand()?

time() кажется болееуникален для меня, потому что дата-время не может повторяться дважды во времени.

mt_rand() Я не уверен насчет уникальных целочисленных предложений по умолчанию в php - будет ли уникальное целое число повторяться во времени?

Ответы [ 4 ]

2 голосов
/ 27 ноября 2011

mt_rand может генерировать одно и то же значение дважды, но вы можете подумать о вероятности того, что, поскольку время возвращает количество секунд с начала эпохи Unix и не может повторяться дважды. Но он меняется каждую секунду, что означает, что при вызове более одного раза в секунду он будет возвращать тот же результат, где mt_rand, вероятно, будет возвращать разные значения.

2 голосов
/ 27 ноября 2011

Если у вас много пользователей, которые делают что-то, что использует time() одновременно, вы можете получить два события, которые происходят в одну секунду, что делает time() не таким уникальным, как mt_rand().Используя mt_rand(), вы почти гарантированно получите уникальные результаты, но вы можете этого не сделать.

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

2 голосов
/ 27 ноября 2011

Рассматривали ли вы uniqid()?

Кроме того, чтобы ответить на ваш актуальный вопрос: mt_rand определенно в конечном итоге повторит число, в отличие от time().Однако вы можете использовать time() только один раз в секунду, если хотите, чтобы он был уникальным.

1 голос
/ 27 ноября 2011

использование time () обычно не очень хорошая идея для уникальных идентификаторов по нескольким причинам:

  1. Разные ОС могут иметь разное разрешение по времени, поэтому вы можете получить 2 одинаковых идентификатора подряд
  2. Это может не иметь значения, но значительно проще угадать идентификаторы, основанные на времени
...