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 в качестве основных функций, которые свободны от проблем, которые имеют большинство генераторов случайных чисел.