首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP ()与random_int()

PHP ()与random_int()
EN

Stack Overflow用户
提问于 2017-05-28 15:00:30
回答 6查看 29.1K关注 0票数 40

由于php.net表示:random_int()函数生成加密安全伪随机整数。

但是,有人能解释一下rand()random_int()之间的区别吗?当只需要随机整数时,我可以使用random_int()而不是rand()吗?哪个更快?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-05-30 18:36:20

重新审视这个问题,看到已经给出了答案,我发现我把我的评论提交给一个答案是公平的,因为它们是以前提交的。

PHP7的random_int()函数手册指出:

“将范围min内的加密安全随机整数返回到最大值(包括在内)。”

对于rand()

*此函数不生成加密安全值“*

OP的评论:

@Fred谢谢。但是密码安全伪随机“意味着什么?- NDFA”

根据我的发现,可以在以下链接中找到:

其中指出:

密码安全伪随机数发生器(CSPRNG)或密码伪随机数生成器(CPRNG)1是伪随机数产生器(PRNG),具有适合密码学使用的特性.

在性能方面,您需要自己运行一个基准。

票数 30
EN

Stack Overflow用户

发布于 2017-08-21 20:37:40

从PHP7.1开始,rand()mt_rand()的别名。更新的random_int()是最慢的,但只有安全的方法。

代码语言:javascript
运行
复制
<?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的结果:

代码语言:javascript
运行
复制
[rand] Time: 0.320 s      
[mt_rand] Time: 0.326 s   
[random_int] Time: 9.255 s
票数 29
EN

Stack Overflow用户

发布于 2020-07-06 12:39:14

兰德()

rand()现在是mt_rand()的别名。从兰德()上可以看出,随机数根本不是随机的。这是一个简单的数学计算,并不比

代码语言:javascript
运行
复制
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()中抽取多少个数字:

代码语言:javascript
运行
复制
php -r '$s=microtime(true);$c=0;while(microtime(true)-$s<10){rand(0,9);$c++;};echo "$c\n";'

random_int()也是如此

代码语言:javascript
运行
复制
php -r '$s=microtime(true);$c=0;while(microtime(true)-$s<10){random_int(0,9);$c++;};echo "$c\n";'

php 7.3的计数器是:

代码语言:javascript
运行
复制
rand():       36665142
random_int(): 10511327

rand()的速度不到4倍。除非速度是一个问题,random_int()是前进的道路,但对于最基本的非关键任务。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44228718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档