【发布时间】:2020-09-07 04:35:22
【问题描述】:
我想创建一个在 dart 中生成随机字符串的函数。 它应该包括混合在一起的字母和数字。我怎样才能做到这一点?
【问题讨论】:
标签: dart
我想创建一个在 dart 中生成随机字符串的函数。 它应该包括混合在一起的字母和数字。我怎样才能做到这一点?
【问题讨论】:
标签: dart
或者如果你不想使用包,你可以做一个简单的实现,比如:
import 'dart:math';
void main() {
print(getRandomString(5)); // 5GKjb
print(getRandomString(10)); // LZrJOTBNGA
print(getRandomString(15)); // PqokAO1BQBHyJVK
}
const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
Random _rnd = Random();
String getRandomString(int length) => String.fromCharCodes(Iterable.generate(
length, (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length))));
我应该补充一点,您不应该使用此代码来生成密码或其他类型的机密。如果你这样做,请至少使用Random.secure() 来创建随机生成器。
【讨论】:
在关于加密字符串的blog article 中找到了这个:
import 'dart:math';
import 'dart:convert';
String getRandString(int len) {
var random = Random.secure();
var values = List<int>.generate(len, (i) => random.nextInt(255));
return base64UrlEncode(values);
}
字符串总是以== 结尾。我还认为这不是最快的解决方案。
但是您不需要第三方包,也不必声明晦涩的常量。
【讨论】:
选项 A 与 charCodes:
import 'dart:math';
String generateRandomString(int len) {
var r = Random();
return String.fromCharCodes(List.generate(len, (index) => r.nextInt(33) + 89));
}
使用可见字符(包括特殊字符)生成随机字符串。
带有预定义字符串的选项 B:
import 'dart:math';
String generateRandomString(int len) {
var r = Random();
const _chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890';
return List.generate(len, (index) => _chars[r.nextInt(_chars.length)]).join();
}
【讨论】:
String 生成 Random 对象并不是最好的方法。这样做的原因是Random() 将基于内部生成的新种子获得一个新的生成器,该种子只有 32 位随机数。这使得它(如果您生成大量随机字符串)很可能获得相同的种子,因此将生成完全相同的String。这就是为什么我确实将Random 对象放在我的方法之外的原因,这样我们就不会不断地创建新的种子随机生成器。这不是问题,因为随机生成器非常好,没有循环的风险。
Random.secure() 没有同样的问题,因为来自这个生成器的每个随机数都来自操作系统。但是您仍然可以通过缓存单个实例来阻止创建对象。
import 'dart:math';
String generateRandomString(int len) {
var r = Random();
String randomString =String.fromCharCodes(List.generate(len, (index)=> r.nextInt(33) + 89));
return randomString;
}
【讨论】: