Я пытаюсь создать уникальный идентификатор токена, могу ли я использовать mt_rand()
?
будут mt_rand()
генерировать одно и то же число дважды?
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 миллиарда идентификаторов в секунду, вам все равно нужно будет выбрать алгоритм, который делает коллизии практически невозможными, а не маловероятными.
Это первый раз, когда я собираюсь ответить на вопрос просто комикс, просто потому что это правильный ответ
mt_rand()
будет возвращать случайное число при каждом вызове.
Но в конечном итоге он вернет номера, которые уже были возвращены вам. Это связано с тем, что наряду с согласованностью с желаемыми статистическими свойствами случайности генератор имеет конечное значение (хотя для Мерсенна Твистера очень большое) периодичность. Если такое поведение нежелательно, то лучше всего перемешать уникальный набор с помощью этого генератора.
mt_rand()
имеет следующие предостережения:
предосторожность: Эта функция не генерирует криптографически безопасный
значения, и не должны использоваться в криптографических целях. Если тебе надо
криптографически безопасное значение, рассмотрите возможность использования
Вместо этого openssl_random_pseudo_bytes ().
А также
предосторожность: Распределение возвращаемых значений mt_rand () смещено в сторону
четные числа в 64-битных сборках PHP, когда max превышает 2 ^ 32.
Если вы согласны с тем, что вы не абсолютно беспристрастны, с вами должно быть все в порядке.
Но если это так, почему вы не используете uniqid?