ulid4d

pub package codecov

用于 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-条款许可证许可的开源软件。

GitHub

查看 Github