如何在飞镖中生成随机字符串?

G19*_*9TV 23 dart

我想创建一个在 dart 中生成随机字符串的函数。它应该包括混合在一起的字母和数字。我怎样才能做到这一点?

jul*_*101 69

或者,如果您不想使用包,则可以进行简单的实现,例如:

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))));
Run Code Online (Sandbox Code Playgroud)

我应该补充一点,您不应使用此代码生成密码或其他类型的机密。如果你这样做,请至少使用Random.secure()来创建随机生成器。


小智 10

import 'dart:math';
    
    String generateRandomString(int len) {
    var r = Random();
    String randomString =String.fromCharCodes(List.generate(len, (index)=> r.nextInt(33) + 89));
      return randomString;
    }
Run Code Online (Sandbox Code Playgroud)


jnn*_*nks 9

一篇关于加密字符串的博客文章中找到了这个:

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);
}
Run Code Online (Sandbox Code Playgroud)

字符串总是以==. 我也认为这不是最快的解决方案。但是您不需要第三方包,也不必声明晦涩的常量。


kon*_*ity 7

带有字符代码的选项 A:

import 'dart:math';

String generateRandomString(int len) {
  var r = Random();
  return String.fromCharCodes(List.generate(len, (index) => r.nextInt(33) + 89));
}
Run Code Online (Sandbox Code Playgroud)

使用可见字符(包括特殊字符)生成随机字符串。

带有预定义字符串的选项 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,为每个“String”生成“Random”对象并不是真正的最佳方法。原因是“Random()”将根据内部生成的新种子获得一个新的生成器,该种子只有 32 位随机数。这使得(如果您生成大量随机字符串)很可能获得相同的种子,因此将生成完全相同的“字符串”。这就是为什么我将“Random”对象放在我的方法之外,这样我们就不会不断创建新的种子随机生成器。这不是问题,因为随机生成器非常好,没有循环的风险。 (3认同)
  • 我应该补充一点,“Random.secure()”没有相同的问题,因为该生成器的每个随机数都来自操作系统。但您仍然可以通过缓存单个实例来阻止创建对象。 (2认同)