昨天我无意中听到关于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()
函数相比,它似乎相当随机。
答案 0 :(得分:7)
直接来自the docs:
此函数不会生成加密安全值,也不应用于加密目的。如果您需要加密安全值,请考虑使用openssl_random_pseudo_bytes()代替。
mt_rand
生成更好的随机数,而不是rand
,并且速度更快。但这并没有使它“安全”#34;从某种意义上说,它应该用于加密。它对您的应用程序是否足够安全是非常主观的。