【问题标题】:How to generate unique id in Dart如何在 Dart 中生成唯一 id
【发布时间】:2013-03-11 00:42:13
【问题描述】:

我写 websocket 聊天。 如何为用户生成唯一ID?

现在我使用这个代码:

id = new DateTime.now().millisecondsSinceEpoch;

还有更简洁的解决方案吗?

【问题讨论】:

    标签: unique dart identity uuid uniqueidentifier


    【解决方案1】:

    1.有一个UUID pub包:

    http://pub.dartlang.org/packages/uuid

    示例用法:

    import 'package:uuid/uuid.dart';
    
    // Create uuid object
    var uuid = Uuid();
    
    // Generate a v1 (time-based) id
    uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
    
    // Generate a v4 (random) id
    uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
    
    // Generate a v5 (namespace-name-sha1-based) id
    uuid.v5(uuid.NAMESPACE_URL, 'www.google.com'); // -> 'c74a196f-f19d-5ea9-bffd-a2742432fc9c'
    

    2. 这个 src 有一个 dart GUID 生成器

    https://github.com/MikeMitterer/AndroidIconGenerator.DART/blob/445884924/lib/src/model/communication/GUIDGen.dart

    src函数没有明显的license,这里就不直接贴了,示例用法如下:

    final String uuid = GUIDGen.generate();
    

    【讨论】:

    • 请注意:这不依赖于强随机数据。因此,生成的 UUID 不应被视为具有加密强度。不管是否重要,我都会让读者自己决定。
    • 谢谢,我知道了,我会再检查一下现有 uuid 的列表
    • @KaiSellgren 这是一篇很老的帖子,但我想我可以通过在这里提问来丰富它。您说“这不依赖于强随机数据”。你能详细说明一下吗?我的意思是,我们怎样才能让它变得更强大?
    • @Felipe 该库现在似乎有一个用于随机数据生成的替代函数:github.com/Daegalus/dart-uuid/blob/master/lib/uuid_util.dart——我没有验证也没有测试过它有多强大,但你可以通过计算卡方分布。如果你好奇的话,我的 Github 页面有一个用于确定随机数据强度的项目。
    • 如何多次使用uuid?我需要在我定义的两个不同字段中解析它 final String image_name = Uuid().v1();但每次我得到不同的结果。
    【解决方案2】:

    在 2020 年,您可以做 UniqueKey();,这是一个内置类:

    https://api.flutter.dev/flutter/widgets/UniqueKey-class.html

    注意

    一个只与自己相等的键。

    这不能用 const 构造函数创建,因为这意味着所有实例化的键都是同一个实例,因此不是唯一的。

    【讨论】:

    • 我认为这个类的预期用途是用于小部件,而不是用作数据库中的 ID。
    • @Rutrus 如果您查看该类,您可以清楚地看到它创建了一个仅在应用程序内部唯一的密钥。这意味着如果您将密钥保存在应用程序之外,例如在数据库中,您以后可能会再次重新创建相同的唯一密钥。 check Here从第83行到第103行还有一个讨论如果你想看看它
    • 谢谢 Gino,但 16^5 对我来说已经足够随机了。这个 UnikeKey() 适用于我的实用程序。当然不是密码安全,但它是一种快速的内置方法。
    • @Rufus 这与加密无关,如果它适用于您的实用程序,那么您应该使用它。就像他们说的“如果它有效,那就不要碰它!”
    • @Gino ,您可以使用UniqueKey().toString() 来获取可以保存在数据库中的唯一字符串文字。 Flutter 团队重写了UniqueKey 类的toString() 方法,返回与键关联的底层id,check here
    【解决方案3】:

    如果你喜欢 MongoDB 风格的 id,你可以考虑这个有助于创建对象 id 的小包:

    https://pub.dev/packages/crossplat_objectid

    import 'package:bson_objectid/bson_objectid.dart';
    
    main() {
      ObjectId id1 = new ObjectId();
      print(id1.toHexString());
    
      ObjectId id2 = new ObjectId.fromHexString('54495ad94c934721ede76d90');
      print(id2.timestamp);
      print(id2.machineId);
      print(id2.processId);
      print(id2.counter);
    }
    

    【讨论】:

      【解决方案4】:

      除了 uuid,你还可以尝试这个来生成小的唯一键:

      https://pub.dev/packages/nanoid

      他们甚至有碰撞计算器:

      https://zelark.github.io/nano-id-cc/

      【讨论】:

        【解决方案5】:

        还有https://pub.dev/packages/xid,它是无锁的,保证每秒和每个主机/进程有 16,777,216(24 位)唯一 ID 的唯一性

        import 'package:xid/xid.dart';
        
        void main() {
          var xid = Xid();
          print('generated id: $xid');
        
        }

        【讨论】:

          猜你喜欢
          • 2018-05-04
          • 2023-03-15
          • 2010-11-30
          • 2019-04-29
          • 2018-10-20
          • 1970-01-01
          • 2012-03-21
          • 2012-07-20
          • 1970-01-01
          相关资源
          最近更新 更多