shortuuid:简洁、无歧义且 URL 安全的 UUID

shortuuid 是 Python 的短 UUID 库,将标准 UUID 转换为更短、URL 安全、易读的字符串,默认使用 Base57 字符表,并排除 l、1、I、O、0 等易混淆字符。适合用于数据库 ID、API Key、URL 参数等用户可见的非连续 ID。
它不是新的 UUID 算法,而是对 UUID 进行紧凑编码;需要保留 UUID 的唯一性时,推荐使用默认 22 位长度。

官网:https://github.com/skorokithakis/shortuuid(BSD 协议)
安装:pip install shortuuid

基本使用:

import shortuuid

shortuuid.uuid()
# 'vytxeTZskVKR7C7WgdSP3d'

默认生成 22 位短 UUID。也可以生成基于名称的 UUID(UUID v5):

shortuuid.uuid(name="example.com")

随机字符串:

shortuuid.ShortUUID().random(length=22)

基于 os.urandom(),适合生成随机 Token。

UUID 编解码:

u = uuid.uuid4()
s = shortuuid.encode(u)
u2 = shortuuid.decode(s)

可以在标准 UUID 和短字符串之间互相转换。

自定义字符集:

shortuuid.set_alphabet("23456789ABCDEFGHJKLMNPQRSTUVWXYZ")

也可以使用 ShortUUID 类实现不同实例使用不同字符集。

缩短长度:

shortuuid.uuid()[:16]

可以截断为更短的 ID,但会降低唯一性、增加碰撞概率。

Django:
提供 ShortUUIDField,可直接作为模型字段或主键,并支持长度、前缀、字符集等配置。

Golang 版本

github.com/lithammer/shortuuid/v5 是 Python shortuuid 的 Go 实现(MIT 协议),基于 UUID 转换为 Base57 短字符串,默认 22 位,URL 安全且避免易混淆字符。

基本生成:

shortuuid.New()   // UUID v4,随机
shortuuid.NewV4() // UUID v4
shortuuid.NewV7() // UUID v7,时间有序

其中 v7 值得重点关注:其短 UUID 保留时间排序特性,因此字符串排序≈创建时间排序,适合数据库 ID、日志 ID 等场景。

UUID 编解码:

enc := shortuuid.DefaultEncoder
s := enc.Encode(uuid.New())
u, err := enc.Decode(s)

注意:Decode() 不负责完整性校验,短字符串也可能被补零后成功解码,因此校验 ID 时应同时检查长度。

UUID v5:

shortuuid.NewV5(shortuuid.NameSpaceDNS, "example.com")

通过 Namespace + Name 生成确定性 ID。

自定义字符集:

enc := shortuuid.NewEncoder("23456789ABCDEFGHJKLMNPQRSTUVWXYZ")
s := enc.Encode(uuid.New())

推荐提前创建并复用 Encoder,避免重复排序、去重。

扩展性:支持自定义 Encoder,因此可以接入 Base58 等其他编码方案。

迁移 v5:NewWithAlphabetNewWithEncoderNewWithNamespace 已废弃,统一推荐使用 NewEncoder 或显式 NewV5

如果你有魔法,你可以看到一个评论框~