2016-04-15 3 views
-3

Привет, я нашел этот скрипт.PHP - этот скрипт является хорошим решением для случайных чисел?

Сценарий:

function urandom_rand($min = 0, $max = 0x7FFFFFFF){ 
$min = (int)$min; 
$max = (int)$max; 
if ($max <= $min) 
    trigger_error('Minimum value must be greater than maximum value.'); 
if ($min < 0 || $max > 0x7FFFFFFF) 
    trigger_error('Values must be between 0 and 2147483647.'); 

$M = bcadd(0x7FFFFFFF,1); // (up bound of iv)+1 
$N = bcadd($max-$min, 1); // how many different values this function can return 
$h = bcmod($M, $N); // the last h integers from unpack are "invalids" 

do{ 
    $bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM); 
    $r = unpack("N", $bytes)[1] & 0x7FFFFFFF; 
} while ($r > ($M-$h)); 
return (bcmod($r, $N) + $min); 
} 

Мой вопрос: Является ли этот сценарий является хорошим решением для генерации случайных чисел?

+0

Хорошо? Определите хорошее. – j08691

+0

Что случилось с ['mt_rand()'] (http://php.net/manual/en/function.mt-rand.php) или даже ['rand()'] (http://php.net/ ручной/EN/function.rand.php)? – axiac

+1

http://php.net/manual/en/function.random-int.php – Sammitch

ответ

0

Эта функция может работать, но не изобретать велосипед.

Почему бы просто не использовать PHP-версию в int rand (int $min , int $max) или int mt_rand (int $min , int $max)?

Основное отличие: mt_rand - faster, а случайные числа sudo не такие, как easy to predict.

Если вам нужна криптографическая хаотичность, it has been suggested использовать int random_int (int $min , int $max) в PHP 7. В более старых версиях PHP, используйте openssl_random_pseudo_bytes и проверьте crypto_strong параметра, чтобы убедиться, что номер, который генерируется криптографический сильный.

+1

Нет, 'mt_rand()' на самом деле * проще * для прогнозирования. Он был создан из-за того, что 'rand()' был слишком медленным. Оба алгоритма генерируют числа и будут воспроизводить повторяющуюся последовательность чисел для данного семени. Эти PRNG отлично подходят для небольших целей, но если вам нужен CSPRNG, в PHP7 есть ['random_int()'] (http://php.net/manual/en/function.random-int.php), а ['random_compat '] (https://github.com/paragonie/random_compat), который возвращает его в PHP5. – Sammitch

+1

Возможно, что при одном и том же семя они будут производить одинаковый вывод [, но математически mt_rand имеют больше энтропии, чем rand "] (http://stackoverflow.com/a/28760933/6194193). Поэтому rand() было бы легче предсказать, как сказал мой ответ. Пример того, как два сравнения смотрят на [Followup: PHP: rand() vs. mt_rand()] (http://web.archive.org/web/20140801002727/http://tjl.co/blog/code/followup-php-rand-vs-mt_rand /) –

+1

Я обновил свой ответ с вашим предложением о криптографической случайности с помощью random_int() @Sammitch –

Смежные вопросы