ulid 是什么

ulid(通用唯一按字典排序的标识符)是一种新型的全局唯一标识符,他结合了时间戳和随机数的特性,提供高性能,低碰撞,并且可排序的标识符。

ulid 特点

  1. 全局唯一性:通过时间戳和随机数,确保生成的ulid在全球都是唯一的。
  2. 时序性ulid中时间戳部分精确到毫米,可以得到ulid的生成时间,因此可以方便对实体进行排序和检索。
  3. 高性能ulid生成速度远快于uuid的生成速度。
  4. 兼容性uliduuid一样都是128位的,可以于现有的uuid标准进行兼容。

ulid主要应用场景

  • 分布式系统:在分布式系统中,可以用ulid作为实体唯一标识符,可以保障不同节点上生成的id是唯一的。

  • 数据库索引:在数据库中使用ulid作为主键,可以避免主键冲突问题,并且可以进行排序,有较好的检索性能。

  • 日志记录:在日志系统中可以用ulid作为唯一id,确保不同机器生成的id是唯一的,同时也可以方便的对日志进行排序和检索。

ulid组成

时间戳

  1. 48bit的整数。
  2. Unix时间戳(毫秒)。

随机数

  1. 80bit的随机数。

排序

最左边的字符必须排在最左边,最右边的字符必须排在最右边,必须使用ASCII字符集

编码方式

通过Crockford的Base32进行编码,该编码方式字母表不包括I、L、O、U。

二进制布局和字节顺序

组件被编码为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                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+