Вчера я услышал разговор о rand()
и mt_rand()
, коллега сказал, что оба они предсказуемы, и вы должны использовать разные функции? Мне было интересно, я знаю, что rand()
предсказуем каким-то образом и после некоторого поиска. Даже mt_rand()
кажется предсказуемым, если я правильно это прочитал.
Для этого я написал небольшой фрагмент кода, который создает изображение:
<?php header("Content-type: image/png"); $im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream"); $white = imagecolorallocate($im, 255, 255, 255); $black = imagecolorallocate($im, 0, 0, 0); for ($y = 0; $y < 512; $y++) { for ($x = 0; $x < 512; $x++) { if (rand(0, 1)) { imagesetpixel($im, $x, $y, $white); } else{ imagesetpixel($im, $x, $y, $black); } } } imagepng($im); imagedestroy($im); ?>
этот код выводит это изображение, так как вы можете видеть, что у него есть какой-то шаблон:
в то время как функция mt_rand()
дала мне этот результат:
теперь мой вопрос: действительно ли mt_rand()
что предсказуемо, кажется мне случайным для меня по сравнению с функцией rand()
.
Непосредственно из документов :
Эта функция не генерирует криптографически безопасные значения и не должна использоваться для криптографических целей. Если вам требуется криптографически безопасное значение, попробуйте вместо этого использовать openssl_random_pseudo_bytes ().
mt_rand
генерирует лучшие случайные числа, чем rand
, и намного быстрее. Но это не делает его «безопасным» в том смысле, что его следует использовать для криптографии. Является ли он достаточно безопасным для вашего приложения, является довольно субъективным.