正如php.net所示: random_int() function 生成加密安全的伪随机整数.
但是,有人可以解释一下rand()&之间的区别random_int()吗?我可以使用random_int()而不是rand()只需要一个随机整数吗?哪一个更快?
Fun*_*ner 15
重新审视这个问题并看到答案给出了答案,我发现将答案提交给答案是公平的,因为他们之前已经提交了答案.
PHP 7的random_int()功能手册说明:
"返回加密安全的随机整数,范围从min到max,包括在内."
并为 rand()
*此函数不会生成加密安全值"*
OP的评论:
"@ Fred-ii-谢谢.但是"加密安全伪随机"是什么意思? - NDFA"
根据我的发现,可以在以下链接中找到:
哪个州:
密码安全伪随机数发生器(CSPRNG)或密码伪随机数发生器(CPRNG)[1]是伪随机数发生器(PRNG),其特性使其适用于密码术.
在性能方面,您需要自己运行基准测试.
Mat*_*sen 12
从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);
Run Code Online (Sandbox Code Playgroud)
结果:
[rand] Time: 10.973 s
[mt_rand] Time: 9.628 s
[random_int] Time: 23.069 s
Run Code Online (Sandbox Code Playgroud)
rand()现在是 的别名mt_rand()。查看mt_rand() 的源代码,可以看到随机数根本不是随机的。这是一个简单的数学计算,并不比
return $min + suffle_bits($internal_counter++) % ($max - $min);
Run Code Online (Sandbox Code Playgroud)
其中suffle_bits()有一些可预测的二进制算术,使其看起来$internal_counter不仅仅是自增。
这就是为什么rand()据说返回伪随机数。返回的数字似乎是随机抽取的,但知道其值$internal_counter可以让您预测接下来会发生什么。
random_int()只要计算机的熵生成器正确启动,就不会遇到这种可预测性问题。
即使攻击者收集了大量的值,也不可能猜测下一个值。
如果攻击者可以从代码的输出中猜测 的值$internal_counter并利用该知识来干扰代码的预期目的,则使用random_int().
如果随机数用于显示(比方说)随机问候语,那么rand()是完全安全的。
现在,如果必须生成一长串 GUID 或条形码,并且最终用户必须无法从子集中猜测另一个有效值,那么random_int()不仅对于安全性而言更好,而且还因为它不会重复本身。rand()根据平台的不同,可能会像 32768 输出一样快速重复。
毫无疑问,rand()更简单,因此也更快。
这是一个易于复制/粘贴的粗略单行命令,用于计算rand()10 秒内可以提取多少个数字:
php -r '$s=microtime(true);$c=0;while(microtime(true)-$s<10){rand(0,9);$c++;};echo "$c\n";'
Run Code Online (Sandbox Code Playgroud)
和同样的random_int():
php -r '$s=microtime(true);$c=0;while(microtime(true)-$s<10){random_int(0,9);$c++;};echo "$c\n";'
Run Code Online (Sandbox Code Playgroud)
php 7.3 的计数器是:
rand(): 36665142
random_int(): 10511327
Run Code Online (Sandbox Code Playgroud)
rand()速度快了不到 4 倍。除非速度是一个问题,random_int()否则对于最基本的非关键任务来说,这是可行的方法。
| 归档时间: |
|
| 查看次数: |
11903 次 |
| 最近记录: |