由于php.net表示:,random_int()
函数生成加密安全伪随机整数。
但是,有人能解释一下rand()
和random_int()
之间的区别吗?当只需要随机整数时,我可以使用random_int()
而不是rand()
吗?哪个更快?
发布于 2017-05-30 18:36:20
重新审视这个问题,看到已经给出了答案,我发现我把我的评论提交给一个答案是公平的,因为它们是以前提交的。
PHP7的random_int()
函数手册指出:
“将范围min内的加密安全随机整数返回到最大值(包括在内)。”
对于rand()
*此函数不生成加密安全值“*
OP的评论:
@Fred谢谢。但是密码安全伪随机“意味着什么?- NDFA”
根据我的发现,可以在以下链接中找到:
其中指出:
密码安全伪随机数发生器(CSPRNG)或密码伪随机数生成器(CPRNG)1是伪随机数产生器(PRNG),具有适合密码学使用的特性.
在性能方面,您需要自己运行一个基准。
发布于 2017-08-21 20:37:40
从PHP7.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);
PHP 7.4的结果:
[rand] Time: 0.320 s
[mt_rand] Time: 0.326 s
[random_int] Time: 9.255 s
发布于 2020-07-06 12:39:14
兰德()
rand()
现在是mt_rand()
的别名。从兰德()上可以看出,随机数根本不是随机的。这是一个简单的数学计算,并不比
return $min + suffle_bits($internal_counter++) % ($max - $min);
其中,suffle_bits()
是一些可预测的二进制算法,以使其看起来像$internal_counter
,而不仅仅是在增加自身。
这就是为什么据说rand()
返回伪随机数的原因。返回的数字似乎是随机绘制的,但是知道$internal_counter
的值可以让您预测接下来会发生什么。
random_int()
只要计算机的熵发生器得到适当的启动,random_int()
就不会受到这个可预见性问题的影响。
即使攻击者收集了大量值,也不可能猜测下一个值。
哪一个最好?
如果攻击者可以从代码的输出中猜测$internal_counter
的值,并使用这些知识来干扰代码的预期目的,那么就使用random_int()
。
如果使用随机数来显示,比方说,随机问候语,那么rand()
是完全安全的。
现在,如果必须生成一个很长的GUID或条形码列表,并且最终用户不能从一个子集中猜测另一个有效值,那么random_int()
不仅在安全性上更好,而且因为它本身不重复。根据平台的不同,rand()
可能以32768的速度重复自己的输出。
哪一个更快?
毫无疑问,rand()
更简单,因此速度更快。
下面是一个简单的单行命令,便于复制/粘贴,以计算10秒内可以从rand()
中抽取多少个数字:
php -r '$s=microtime(true);$c=0;while(microtime(true)-$s<10){rand(0,9);$c++;};echo "$c\n";'
random_int()
也是如此
php -r '$s=microtime(true);$c=0;while(microtime(true)-$s<10){random_int(0,9);$c++;};echo "$c\n";'
php 7.3的计数器是:
rand(): 36665142
random_int(): 10511327
rand()
的速度不到4倍。除非速度是一个问题,random_int()
是前进的道路,但对于最基本的非关键任务。
https://stackoverflow.com/questions/44228718
复制相似问题