dart - 如果不需要加密强的随机数,使用 Random() 优于 Random.secure() 是否有优势?
问题描述
Dart 有两种不同的生成随机数的方法。Random()
和Random.secure()
,其中前者是伪随机的。只有这些信息,很明显Random.secure()
应该一直使用它来确保生成的数字是完全随机的。
但是,由于两种生成数字的方式都存在,我怀疑使用Random()
. 这是正确的,在这种情况下这些优势是什么?
解决方案
我做了一些测试,就像人们评论的那样,Random()
确实更快。
生成 0 到 100 之间的 100000 个随机整数时,Random()
速度快 334 毫秒,获得一个随机数的平均时间为 0.03 毫秒,而Random.secure()
. 因此,除非您生成大量数字或您正在执行的任务需要高速,否则这种差异可能无关紧要。
我发现的另一个区别来自文档:
/// If the program cannot provide a cryptographically secure
/// source of random numbers, it throws an [UnsupportedError].
这意味着Random.secure()
在某些平台上可能会失败,而Random()
不会。因此,除非需要安全号码,否则Random()
可能是首选,因为您不必关心错误处理。
这是我为测试速度而编写的代码。for 循环可能会产生一些开销,但由于我正在进行比较,因此不会影响差异。
import 'dart:math';
void main(List<String> arguments) {
var psuedoRandom = Random();
var secureRandom = Random.secure();
var length = 100000;
var startTime = DateTime.now();
for (var i = 0; i < length; i++) {
psuedoRandom.nextInt(100);
}
var psuedoDuration = DateTime.now().microsecondsSinceEpoch - startTime.microsecondsSinceEpoch;
var psuedoAverage = psuedoDuration / length;
startTime = DateTime.now();
for (var i = 0; i < length; i++) {
secureRandom.nextInt(100);
}
var secureDuration = DateTime.now().microsecondsSinceEpoch - startTime.microsecondsSinceEpoch;
var secureAverage = secureDuration / length;
var psuedoAdvantage = secureDuration - psuedoDuration;
print('length: $length\n');
print('psuedo duration: $psuedoDuration');
print('psuedo average duration: $psuedoAverage\n');
print('secure duration: $secureDuration');
print('secure average duration: $secureAverage\n');
print('Advantage for psuedo: $psuedoAdvantage');
}
推荐阅读
- html - 带有 CSS 的标签后的样式复选框
- mysql - 用于 AWS Aurora 的 Spring Boot 中的 MariaDB 配置 - 将查询路由写入读取器实例
- javascript - Javascript数组访问(以字符串文字为键) - 空间复杂度
- python - 扩展字典:通过函数传递关键字参数不起作用
- powerbi - Power BI Measure 计算随过滤器变化的百分比
- leaflet - 如何设置标记的可滚动偏移量
- nativescript - 没有得到如何使用来自android选择器意图的传入图像
- ios - 如何解决 NSURLErrorDomain:无法快速解码原始数据
- reactjs - 使用 jest 进行快照测试时无法模拟库值
- javascript - 如何在 phpmyadmin 4.0 中隐藏单个值/行