使用ULID库生成唯一ID

UUID的5个算法中最常用的是UUID4了,但是,即使是随机的,但是也是存在冲突的风险。和UUID要么基于随机数要么基于时间戳不同,ULID是既基于时间戳又基于随机数,不用担心冲突的风险,而且转换成字符串比UUID更加友好。

应用场景

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

安装与使用

安装

1
pip install ulid-py

创建一个全新的ULID

1
2
3
4
5
6
7
8
9
import ulid

u = ulid.new()

# 时间戳记值(48位)来自 time.time(),精度为毫秒
print(u.timestamp())

# 随机值(80位)来自 os.urandom()
print(u.randomness())

根据现有的128位值(例如UUID)创建新的ULID

1
2
3
4
5
import ulid, uuid

value = uuid.uuid4()

print(ulid.from_uuid(value))

从现有时间戳值(例如datetime对象)创建新的ULID

1
2
3
import datetime, ulid

print(ulid.from_timestamp(datetime.datetime(1999, 1, 1)))

根据现有的随机数创建一个新的ULID

1
2
3
4
5
6
import os, ulid

# 支持随机值类型有int,float,str,bytes,bytearray,memoryview,Randomness,和ULID
randomness = os.urandom(10)

print(ulid.from_randomness(randomness))