#uuid #ulid #byte #identifier #universal

ruilid

Rust 通用的唯一按字典顺序排序的标识符

2 个版本

使用旧的 Rust 2015

0.3.1 2017年7月22日
0.3.0 2017年3月4日

#1612编码

自定义许可证

18KB
210

通用的唯一按字典顺序排序的标识符

Build Status Language (Rust)

UUID 在许多用例中可能不是最优选择,因为

  • 它不是编码 128 位随机性最字符高效的编码方式
  • 字符串格式显然是基于原始的 MAC & 时间版本(UUIDv1 来自维基百科)
  • 它只提供了随机性信息

因此,这里提出了 ULID

  • 与 UUID 兼容的 128 位
  • 每毫秒有 1.21e+24 个唯一的 ULID
  • 字典序可排序的!
  • 规范编码为 26 个字符的字符串,而 UUID 为 36 个字符
  • 使用 Crockford 的 base32 以提高效率和可读性(每字符 5 位)
  • 不区分大小写
  • 没有特殊字符(URL 安全)

其他语言的实现

来自社区!

语言 作者
JavaScript alizain
Erlang savonarola
Elixir merongivian
Go imdario
Java Lewiscowles1986
Julia ararslan
.NET RobThree
.NET fvilers
PHP Lewiscowles1986
Python mdipierro
Ruby rafaelsales

规范

以下是此存储库中实现的 ULID 的当前规范。

 01AN4Z07BY      79KA1307SR9X4MV3

|----------|    |----------------|
 Timestamp          Randomness
  10 chars           16 chars
   50bits             80bits
   base32             base32

组件

时间戳

  • 48 位整数
  • UNIX 时间,以毫秒为单位
  • 直到公元 10895 年才耗尽空间。

随机性

  • 80 位
  • 如果可能,使用加密安全的随机数源

排序

必须首先按字典顺序排序最左边的字符,然后按字典顺序排序最右边的字符。必须使用默认的 ASCII 字符集。在同一毫秒内,排序顺序不保证

编码

使用 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_low                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     16_bit_uint_time_high     |       16_bit_uint_random      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       32_bit_uint_random                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

字符串表示

ttttttttttrrrrrrrrrrrrrrrr

where
t is Timestamp
r is Randomness

先前的艺术作品

部分受以下启发

依赖关系

~1.4–1.9MB
~27K SLoC