Mt_rand () генерирует один и тот же номер дважды?

Я пытаюсь создать уникальный идентификатор токена, могу ли я использовать mt_rand()?

будут mt_rand() генерировать одно и то же число дважды?

1

Решение

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

Чтобы использовать генератор случайных чисел для уникальных идентификаторов, вероятность создание одного и того же числа дважды должно быть настолько низким, чтобы на практике это не имело значения. В этой связи, mt_rand вероятно не достаточно. Концепция случайно сгенерированных уникальных идентификаторов была формализована в UUID,, который вы должны использовать именно для цели универсально уникальный идентификатор.

принимать Эта цитата:

…только после генерирования 1 миллиарда UUID каждую секунду в течение следующих 100 лет вероятность создания только одного дубликата составит около 50%.

поскольку mt_rand возвращает 32-разрядное целое число в 32-разрядных системах; он может возвращать только 2 ^ 32 уникальных значения, что составляет всего лишь 4 294 967 296 уникальных значений. Если бы вы генерировали миллиард mt_rand ценности каждую секунду, вы в основном гарантированный дубликат через 4 секунды. Это, надеюсь, иллюстрирует разницу в масштабе между UUID и mt_rand и почему это важно. Даже если вы генерируете намного меньше 1 миллиарда идентификаторов в секунду, вам все равно нужно будет выбрать алгоритм, который делает коллизии практически невозможными, а не маловероятными.

2

Другие решения

Это первый раз, когда я собираюсь ответить на вопрос просто комикс, просто потому что это правильный ответ

введите описание изображения здесь

Оригинал на Dilbert.com.

12

mt_rand() будет возвращать случайное число при каждом вызове.

Но в конечном итоге он вернет номера, которые уже были возвращены вам. Это связано с тем, что наряду с согласованностью с желаемыми статистическими свойствами случайности генератор имеет конечное значение (хотя для Мерсенна Твистера очень большое) периодичность. Если такое поведение нежелательно, то лучше всего перемешать уникальный набор с помощью этого генератора.

0

mt_rand() имеет следующие предостережения:

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

А также

предосторожность: Распределение возвращаемых значений mt_rand () смещено в сторону
четные числа в 64-битных сборках PHP, когда max превышает 2 ^ 32.

Если вы согласны с тем, что вы не абсолютно беспристрастны, с вами должно быть все в порядке.

Но если это так, почему вы не используете uniqid?

0
По вопросам рекламы [email protected]