新型唯一标识符 ULID 详解

目录

什么是 ULID

ULID 的具体结构

ULID 的特点

ULID 的应用场景

ULID 的生成方法

安全考虑

小结


什么是 ULID

ULID(Universally Unique Lexicographically Sortable Identifier,通用唯一字典排序标识符)是一种新型的唯一标识符格式,由 Alizain Feerasta 在2016年提出,在保持唯一性的同时,提供了可排序的特性。ULID 旨在解决 UUID 在某些场景下存在问题,并提供额外的优势。这使得 ULID 在需要排序的同时保持全局唯一性的场景中非常有用,例如在分布式系统中用于日志排序、数据库主键等。

ULID 由 128 位组成,通常表示为 26 个字符长的字符串(也可以表示为 32 个十六进制字符的字符串),其中前半部分是时间戳信息,后半部分是随机序列。这种设计使得 ULID 不仅在全球范围内具有很高的唯一性,还能根据生成的时间顺序进行高效的字典序排序。

ULID 的具体结构

ULID 的格式是固定的,由 128 位组成,通常表示为 26个字符(也可以编码为32位的十六进制字符串)。这26个字符分为两部分:

  1. 时间戳部分:前10个字符表示生成 ULID 时的时间戳,精确到毫秒。
  2. 随机数部分:后16个字符是随机数,由随机生成的数字组成,用于确保在相同的毫秒时间戳内生成的 ULID 之间的唯一性。

ULID 使用 Crockford 的 Base32 编码方案,排除了一些容易混淆的字符,比如小写的“l”和数字“1”,大写的“O”和数字“0”,使得 ULID 在视觉上更易于区分,并且在人工输入时出错的可能性更小。

ULID 的特点

  • 唯一性:由于时间戳和随机数的组合,ULID 具有极高的唯一性。在同一毫秒内,即使生成多个 ULID,也不会出现重复的情况。
  • 时序性:ULID 的时间戳部分精确到毫秒,可以反映 ULID 的生成时间。这使得 ULID 具有时序性,方便对实体进行排序和检索。
  • 可读性:ULID 由26个字符组成,采用 Crockford 的 base32 编码,具有较好的可读性。同时,ULID 的长度较短,便于在日志和数据库中存储和展示。
  • 性能:ULID 的生成过程不需要访问网络,且时间戳和随机数的生成速度较快,因此在性能上优于传统的 UUID。
  • 兼容性:ULID 和 UUID 都是 128位,与现有的 UUID 标准兼容。

ULID 的应用场景

ULID 的设计初衷是为了解决 UUID 在某些场景下表现不佳的问题,尤其是在需要有序标识符的场景,ULID在许多现代应用程序中变得越来越流行,特别是在以下场景:

  • 分布式系统:在分布式系统中,使用 ULID 作为实体的唯一标识符,可以保障在不同节点上生成的标识符是唯一的。
  • 数据库索引:在数据库中使用 ULID 作为主键,不仅可以避免主键冲突的问题,也可以进行排序,具有较好的检索性能和可读性。
  • 日志记录:日志系统可以利用 ULID 的可排序性,确保不同机器中同类日志条目的时间顺序,可以方便地对日志进行排序和检索。
  • 云服务资源标识:在云环境中标识唯一的虚拟机、容器或者对象存储文件等。
  • 微服务间通信:用作请求 ID,确保请求在服务间传递时具备唯一性和可追溯性。

ULID 的生成方法

ULID的生成方式如下:

  1. 获取当前时间戳,并转换为60位二进制形式;
  2. 生成一个80位的随机或伪随机数;
  3. 将上述时间和随机序列拼接起来,形成128位的数据;
  4. 将128位数据转换为base32编码的字符串表示。

安全考虑

尽管 ULID 提供了唯一性和可排序性,但在安全性要求较高的应用中使用时,需要注意以下几点:

  • 随机部分需要足够的随机性,以防止预测未来的 ULID。
  • 时间戳部分可能会泄露信息,攻击者可能利用这些信息推断出生成 ULID 的时间。

小结

ULID 作为一种新型的全局唯一标识符,在保证唯一性的同时增加了可排序性。使得ULID 非常适合需要排序和高性能唯一标识符的现代应用程序。随着分布式系统和微服务架构的普及,ULID 会变得更加流行。在选择唯一标识符算法时,应该综合考虑具体需求,并平衡唯一性、性能和安全性之间的关系。

你可能感兴趣的:(后端系列知识讲解,数据库,后端,网络,唯一标识符,ULID)