ulid4d
用于 Dart 的通用唯一字典序可排序标识符 (ULID) 实现,支持二进制实现和单调性。
后台
UUID 在许多用例中可能不是最优的,因为
- 它不是编码 128 位随机性的最字符高效的方式
- UUID v1/v2 在许多环境中不可行,因为它需要访问唯一的、稳定的 MAC 地址
- UUID v3/v5 需要一个唯一的种子并产生随机分布的 ID,这可能导致许多数据结构碎片化
- UUID v4 除了随机性外不提供任何其他信息,这可能导致许多数据结构碎片化
相反,此处建议使用 ULID
- 与 UUID 的 128 位兼容性
- 每毫秒 1.21e+24 个唯一的 ULID
- 字典序可排序!
- 作为 26 个字符的字符串进行规范编码,而不是 36 个字符的 UUID
- 使用 Crockford 的 base32 以获得更好的效率和可读性 (每字符 5 位)
- 不区分大小写
- 无特殊字符 (URL 安全)
- 单调排序顺序 (正确检测和处理同一毫秒)
用法
- 生成 ULID 字符串
var ulid = ULID.randomULID();
- 生成
ULID实例
var ulid = ULID.nextULID();
var ulidString = ulid.toString();
- 使用
ULIDFactory生成ULID
var factory = ULIDFactory();
var ulid = factory.nextULID();
var ulidString = ulid.toString();
您可以使用 ULIDFactory(Random) 来使用不同的 Random 实例。
- 从/到字节生成
ULID
// generate a ULID instance
var ulid = ULID.nextULID();
// generate byte array (Uint8List) of ULID instance
var data = ulid.toBytes();
// generate a ULID from given byte array using 'fromBytes'
var ulidFromBytes = ULID.fromBytes(data);
- 从/到 ULID 字符串生成
ULID
// generate a ULID string
var ulidString = ULID.randomULID();
// generate a ULID from given String using 'fromString'
var ulidFromString = ULID.fromString(ulidString);
// generate a ULID String from ULID instance
var ulidStringFromULID = ulid.toString();
单调性
- 生成单调
ULID
// generate ULID instance using a monotonic factory
var ulid = ULID.nextMonotonicULID(ulid);
// using a monotonic factory, generate a ULID instance or null in case
// of overflow
var ulidStrict = ULID.nextMonotonicULIDStrict(ulidMono);
- 使用
ULIDMonocity工厂生成ULID
// generate ULID using ULID monotonic factory
var factory = ULIDMonotonic();
var ulid = factory.nextULID(ulid);
var ulidStrict = factory.nextULIDStrict(ulid);
规范
以下是此存储库中实现的 ULID 的当前规范。
组件
时间戳
- 48 位
- UNIX 时间(毫秒)
- 在公元 10889 年之前不会耗尽空间
熵
- 80 位
- 用户定义的熵源。
编码
使用了 Crockford 的 Base32。该字母表排除了字母 I、L、O 和 U,以避免混淆和滥用。
0123456789ABCDEFGHJKMNPQRSTVWXYZ
二进制布局和字节顺序
组件被编码为 16 个字节。每个组件都以最高有效字节在前(网络字节顺序)进行编码。
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32_bit_uint_time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 16_bit_uint_time_low | 16_bit_uint_random |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32_bit_uint_random |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 32_bit_uint_random |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字符串表示
01AN4Z07BY 79KA1307SR9X4MV3
|----------| |----------------|
Timestamp Entropy
10 chars 16 chars
48bits 80bits
base32 base32
先前的作品
许可证
ulid4d 是根据 BSD 3-条款许可证许可的开源软件。