如何在 Dart 中生成唯一 id

问题描述 投票:0回答:9

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

现在我使用这个代码:

id = new DateTime.now().millisecondsSinceEpoch;

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

unique dart identity uuid uniqueidentifier
9个回答
201
投票

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,因为它没有明显的许可证,但示例用法如下:

final String uuid = GUIDGen.generate();

80
投票

在 2020 年,您可以做

UniqueKey();
,这是一个内置课程:

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

注意

一个只等于它本身的键。

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


23
投票

我使用微秒而不是毫秒,这样更准确,而且不需要添加任何包。

 String idGenerator() {
    final now = DateTime.now();
    return now.microsecondsSinceEpoch.toString();
  }

13
投票

除了 uuid 之外,您还可以尝试生成小的唯一密钥:

https://pub.dev/packages/nanoid

他们甚至有一个碰撞计算器:

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


4
投票

此方法将生成类似于 (-N4pvg_50j1CEqSb3SZt) 的唯一 ID

String getCustomUniqueId() {
  const String pushChars =
      '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';
  int lastPushTime = 0;
  List lastRandChars = [];
  int now = DateTime.now().millisecondsSinceEpoch;
  bool duplicateTime = (now == lastPushTime);
  lastPushTime = now;
  List timeStampChars = List<String>.filled(8, '0');
  for (int i = 7; i >= 0; i--) {
    timeStampChars[i] = pushChars[now % 64];
    now = (now / 64).floor();
  }
  if (now != 0) {
    print("Id should be unique");
  }
  String uniqueId = timeStampChars.join('');
  if (!duplicateTime) {
    for (int i = 0; i < 12; i++) {
      lastRandChars.add((Random().nextDouble() * 64).floor());
    }
  } else {
    int i = 0;
    for (int i = 11; i >= 0 && lastRandChars[i] == 63; i--) {
      lastRandChars[i] = 0;
    }
    lastRandChars[i]++;
  }
  for (int i = 0; i < 12; i++) {
    uniqueId += pushChars[lastRandChars[i]];
  }
  return uniqueId;
}

4
投票

我构建了一个场景来生成唯一的加密安全随机 ID。 有 4 个随机生成的 id

  1. 字母列表中的前 4 个字母 [a-z]。

  2. 数字列表中的中间 4 位数字 [0-9]。

  3. DateTime 自纪元子字符串 8 - 12 起 4 微秒,因为它们经常更改。

  4. 字母列表中的最后 4 个字母 [a-z]。

生成的 id 的屏幕截图:

要调用的函数

  randomIdGenerator() {
  var ranAssets = RanKeyAssets();
  String first4alphabets = '';
  String middle4Digits = '';
  String last4alphabets = '';
  for (int i = 0; i < 4; i++) {
    first4alphabets += ranAssets.smallAlphabets[
        math.Random.secure().nextInt(ranAssets.smallAlphabets.length)];

    middle4Digits +=
        ranAssets.digits[math.Random.secure().nextInt(ranAssets.digits.length)];

    last4alphabets += ranAssets.smallAlphabets[
        math.Random.secure().nextInt(ranAssets.smallAlphabets.length)];
  }

  return '$first4alphabets-$middle4Digits-${DateTime.now().microsecondsSinceEpoch.toString().substring(8, 12)}-$last4alphabets';
}

列表类

    class RanKeyAssets {
  var smallAlphabets = [
    'a',
    'b',
    'c',
    'd',
    'e',
    'f',
    'g',
    'h',
    'i',
    'j',
    'k',
    'l',
    'm',
    'n',
    'o',
    'p',
    'q',
    'r',
    's',
    't',
    'u',
    'v',
    'w',
    'x',
    'y',
    'z'
  ];
  var digits = [
    '0',
    '1',
    '2',
    '3',
    '4',
    '5',
    '6',
    '7',
    '8',
    '9',
  ];
}

1
投票

如果您喜欢 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);
}

1
投票

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

import 'package:xid/xid.dart';

void main() {
  var xid = Xid();
  print('generated id: $xid');

}


0
投票

要生成唯一的 ID,您可以使用此代码

import 'package:id_gen/id_gen.dart';

print(UuidV4Gen().get());

来自轻量级且经过充分测试的 Dart 包 https://pub.dev/packages/id_gen

© www.soinside.com 2019 - 2024. All rights reserved.