使用 ulid-py 替换 uuid

ULID特性

1
2
3
import ulid
ulid.new()
<ULID('01BJQE4QTHMFP0S5J153XCFSP9')>
  • 与UUID的128位兼容性
  • 每毫秒1.21e + 24个唯一ULID
  • 按字典顺序(也就是字母顺序)排序!
  • 规范地编码为26个字符串,而不是UUID的36个字符
  • 使用Crockford的base32获得更好的效率和可读性(每个字符5位)
  • 不区分大小写
  • 没有特殊字符(URL安全)
  • 单调排序顺序(正确检测并处理相同的毫秒)

ULID组成

1
2
3
4
5
6
01BJQE4QTH      MFP0S5J153XCFSP9

|----------|    |----------------|
 Timestamp          Randomness
  10chars            16chars
   48bits             80bits

时间戳

  • 48位整数
  • UNIX时间(以毫秒为单位)
  • 直到公元10889年,空间都不会耗尽。 随机性
  • 80位随机数
  • 如果可能的话,采用加密技术保证随机性

应用场景

  • 替换数据库自增id,无需DB参与主键生成
  • 分布式环境下,替换UUID,全局唯一且毫秒精度有序
  • 比如要按日期对数据库进行分区分表,可以使用ULID中嵌入的时间戳来选择正确的分区分表
  • 如果毫秒精度是可以接受的(毫秒内无序),可以按照ULID排序,而不是单独的created_at字段

安装

1
pip install ulid-py

使用

创建一个全新的ULID。

时间戳记值(48位)来自 time.time(),精度为毫秒。

随机值(80位)来自 os.urandom()。

1
2
3
>>> import ulid
>>> ulid.new()
<ULID('01BJQE4QTHMFP0S5J153XCFSP9')>

参考