【问题标题】:How to generate random string in dart?如何在飞镖中生成随机字符串?
【发布时间】:2020-09-07 04:35:22
【问题描述】:

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    或者如果你不想使用包,你可以做一个简单的实现,比如:

    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() 来创建随机生成器。

    【讨论】:

      【解决方案2】:

      在关于加密字符串的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);
      }
      

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

      【讨论】:

        【解决方案3】:

        选项 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() 没有同样的问题,因为来自这个生成器的每个随机数都来自操作系统。但是您仍然可以通过缓存单个实例来阻止创建对象。
        • 谢谢 :) @julemand101
        【解决方案4】:
        import 'dart:math';
            
            String generateRandomString(int len) {
            var r = Random();
            String randomString =String.fromCharCodes(List.generate(len, (index)=> r.nextInt(33) + 89));
              return randomString;
            }
        

        【讨论】:

          猜你喜欢
          • 2022-10-17
          • 2022-06-19
          • 1970-01-01
          • 1970-01-01
          • 2019-09-19
          • 1970-01-01
          • 1970-01-01
          • 2012-02-13
          • 2010-09-10
          相关资源
          最近更新 更多