PHP rand() vs. random_int()
Как php.net указывает: random_int()
функция Генерирует криптографически защищенные псевдослучайные целые числа.
Но может ли кто-нибудь объяснить, в чем разница между rand()
и random_int()
? Могу ли я использовать random_int()
вместо rand()
, когда требуется только случайное целое число? Какой из них быстрее?
Ответы
Ответ 1
Повторяя вопрос и увидев ответ, я считаю справедливым, что я отправляю свои комментарии на ответ, видя, что они были представлены раньше.
В руководстве по функции PHP 7 random_int()
указано:
"Возвращает криптографически защищенное случайное целое число в диапазоне от min до max, включительно."
и для rand()
* Эта функция не генерирует криптографически безопасные значения "*
Комментарий OP:
"@Fred-ii- спасибо. Но что означает" криптографически безопасное псевдослучайное "? - NDFA"
Это можно найти в следующих ссылках в соответствии с моими выводами:
Какие состояния:
Криптографически защищенный генератор псевдослучайных чисел (CSPRNG) или криптографический генератор псевдослучайных чисел (CPRNG) [1] - генератор псевдослучайных чисел (PRNG) со свойствами, которые делают его пригодным для использования в криптографии.
Что касается производительности, вам нужно будет запустить тест самостоятельно.
Ответ 2
Начиная с PHP 7.1, rand()
является псевдонимом для mt_rand()
. Более новый random_int()
- самый медленный, но единственный безопасный метод из трех.
<?php
$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 10000000; $i++) {
$sum += rand(0, 32767);
}
printf('[rand] Time: %.3f s%s', microtime(true) - $start, PHP_EOL);
$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 10000000; $i++) {
$sum += mt_rand(0, 32767);
}
printf('[mt_rand] Time: %.3f s%s', microtime(true) - $start, PHP_EOL);
$start = microtime(true);
$sum = 0.0;
for ($i = 0; $i < 10000000; $i++) {
$sum += random_int(0, 32767);
}
printf('[random_int] Time: %.3f s%s', microtime(true) - $start, PHP_EOL);
Результаты:
[rand] Time: 10.973 s
[mt_rand] Time: 9.628 s
[random_int] Time: 23.069 s
Ответ 3
Как и большинство генераторов чисел, использование rand() небезопасно, поскольку оно не генерирует криптографически защищенные значения, а выход rand() предсказуем.
PHP 7.0 вводит random_bytes и random_int в качестве основных функций, которые свободны от проблем, которые имеют большинство генераторов случайных чисел.