flutter - 如何获得特定范围内的随机 BigInt (Dart)
问题描述
如果之前有人问过这个问题,我很抱歉,但我找不到任何对我有帮助的解决方案。
基本上,我有一个巨大的数字n
,其中n
有一个 4000 位数。int
显然,它不适合Dart中原始类型所允许的 64 位。
我需要找到一个随机数g
,这样2 ≤ g ≤ (n - 1)
。有没有办法可以生成这样的随机数?
我目前的解决方案:
void _generatePrivateKey() {
const numbers = '0123456789';
final halfOfNLength = N.toString().length ~/ 2; // Where `N` is `BigInt`
final length = _rand.nextInt(halfOfNLength) + halfOfNLength;
final buffer = StringBuffer();
for (var _ = 0; _ < length; _++) {
buffer.write(numbers[_rand.nextInt(numbers.length)]);
}
_privateKey = BigInt.parse(buffer.toString());
}
我知道这不是一个好的解决方案,但这就是我现在所拥有的
解决方案
package:pointycastle
包含一个实用程序文件,该文件具有decodeBigInt
将字节列表转换为BigInt
.
以下是如何使用它来生成 4000 位值:
import 'dart:math';
import 'dart:typed_data';
BigInt randomBigInt() {
const size = 4000;
final random = Random.secure();
final builder = BytesBuilder();
for (var i = 0; i < size; ++i) {
builder.addByte(random.nextInt(256));
}
final bytes = builder.toBytes();
return decodeBigInt(bytes);
}
或者,decodeBigIntWithSign
可用于强制执行否定或肯定结果。
推荐阅读
- c# - 在 EventSourcing 中,关于订阅的公认智慧是什么?
- javascript - 使用 Redux 在 Axios 调用后更新 React 组件状态
- eiffel - 埃菲尔:多个通用约束的语法错误
- mongodb - 如何验证在连接级别设置的 mongoDB 选项
- angular - ngx-quill / quill.js 自定义印迹操作
- python - 在对帧进行排序时使用 try 语句
- angular - 有什么方法可以调试为什么角度路线没有被识别?
- c# - 使用转换器更改所有列的背景?
- json - i18next 翻译外部组件
- python - SintaxError,for 循环中的无效 Sintax