如何在 Dart 中生成唯一的 ID

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

现在我用这个代码:

id = new DateTime.now().millisecondsSinceEpoch;

is there any more neat solution?

98576 次浏览

有一个 UUID 发布包:

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'

这个 src 有一个 dart GUID 生成器

Https://github.com/mikemitterer/androidicongenerator.dart/blob/445884924/lib/src/model/communication/guidgen.dart

我不会直接在这里发布函数 src,因为它没有明显的许可证,但是示例使用如下:

final String uuid = GUIDGen.generate();

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

Https://api.flutter.dev/flutter/foundation/uniquekey-class.html

注意

一把只等于它自己的钥匙。

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

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

除了 uuid 之外,您还可以尝试这样生成小的惟一键:

Https://pub.dev/packages/nanoid

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

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

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

import 'package:xid/xid.dart';


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


}

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

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

此方法将生成与(- 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;
}

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

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

  2. Middle 4 digits from a digits list [0-9].

  3. DateTime4微秒,因为它们经常更改。

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

生成 id 的屏幕截图:

first generated id second generated id third generated id

A Function to Call

  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',
];
}