2 个版本
使用旧的 Rust 2015
0.3.1 | 2017年7月22日 |
---|---|
0.3.0 | 2017年3月4日 |
#1612 在 编码
18KB
210 行
通用的唯一按字典顺序排序的标识符
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