1. ULID 与 UUID 的对比
ULID(Universally Unique Lexicographically Sortable Identifier)
软件开发中,唯一标识符(Unique Identifier,简称 UUID)扮演着非常重要的角色,用于保证数据的唯一性和标识对象。UUID 是一串由 16 字节组成的字符序列,通常使用标准的 36 个字符表示法(例如:550e8400-e29b-41d4-a716-446655440000)。然而,传统的 UUID 存在一些问题,比如无法按时间排序、长度较长等。
为了解决这些问题,ULID(Universally Unique Lexicographically Sortable Identifier)应运而生。ULID 是由 Alizain Feerasta 在 2016 年提出的一种可排序的随机标识生成方式。与传统的 UUID 相比,ULID 具有以下优点:
1.1 可排序性
ULID 能够根据生成时的时间戳进行排序,使得生成的标识能够按照时间顺序排列,并且支持范围查询和快速索引。
1.2 长度更短
ULID 使用 26 个字符的 Base32 编码表示,相比标准的 UUID 使用的 36 个字符长度更短,减少网络传输和存储的开销。
1.3 高性能
由于 ULID 可以根据时间戳排序,它非常适合在分布式系统中使用,尤其是在高并发环境下,可以有效减少冲突和竞争。
尽管 ULID 的冲突概率很低,但并不能保证完全唯一。因此,在高度依赖唯一性的场景中,仍建议使用更长的 UUID。
2. ULID 的结构
ULID 的结构由两部分组成:时间部分和随机数部分。如果在短时间内生成多个 ULID,那么结果可能是这样:
01H69Y96VND6PYACNN2P0RX2RV
01H69Y96VN8QBBYS7QNFK3BC6F
01H69Y96VNM8CMCY0Y2PMPYJY7
01H69Y96VNDD5D8PNMR736TB84
01H69Y96VN9KY23BVBW1Y8NQJV
具体而言,一个 ULID 标识符包含了以下信息:
2.1 时间戳
ULID 使用 48 位存储时间戳,精确到毫秒级别。时间戳表示生成 ULID 的时间,且是自增的,因此可以用来对 ULID 进行排序。
2.2 随机数
ULID 使用 80 位的随机数部分来提高唯一性。这部分随机数通过加密强度较高的随机数生成器产生,确保了生成的 ULID 具有高度的唯一性。
为了更好地可视化 ULID,通常将其表示为一个由 26 个字符组成的字符串。其中,前面部分包含了时间戳信息,后面部分是随机数,均使用 Base32 编码表示。
ULID 是一个特定的标识符格式,具有特定的字符长度和字符集。生成的 ULID 应该是唯一的且按字典顺序可排序的
shell命令生成ulid
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 26 | head -n 1
- ulid-py(Python):https://github.com/ulid/spec-python
- Java ULID(Java):GitHub - azam/ulidj: ULID (Universally Unique Lexicographically Sortable Identifier) generator and parser for Java.
- ulid-rs(Rust):https://github.com/mmacedoeu/ulid-rs
- ulid-cli(命令行工具):https://github.com/ulid/spec-cli