唯一 ID 工具 - IdUtil

由来

在分布式系统中,唯一 ID 的生成是常见需求。IdUtil 提供了 UUID、NanoId、雪花 ID 等多种 ID 生成方案。

方法

UUID

from hutool import IdUtil

# 标准 UUID(带横线)
IdUtil.random_uuid()       # "a1b2c3d4-e5f6-7890-abcd-ef1234567890"

# 简单 UUID(无横线)
IdUtil.simple_uuid()       # "a1b2c3d4e5f67890abcdef1234567890"

# 快速 UUID(使用 uuid4)
IdUtil.fast_uuid()         # 同 random_uuid
IdUtil.fast_simple_uuid()  # 同 simple_uuid

NanoId

NanoId 是一种更短、更安全的 ID 生成算法:

IdUtil.nano_id()           # "V1StGXR8_Z5jdHi6B-myT"(默认21位)
IdUtil.nano_id(10)         # "V1StGXR8_Z5"(自定义长度)

雪花 ID

雪花算法生成的 64 位整数 ID,适用于分布式系统:

IdUtil.snowflake_id()      # 1234567890123456789

雪花 ID 结构:

  • 1 位符号位

  • 41 位时间戳(毫秒)

  • 10 位工作机器 ID

  • 12 位序列号

# 创建雪花 ID 生成器
worker = IdUtil.create_snowflake(worker_id=1, datacenter_id=1)
id_val = worker.next_id()

# 获取全局单例雪花生成器
snowflake = IdUtil.get_snowflake(1, 1)

# 获取下一个雪花 ID
IdUtil.get_snowflake_next_id(1, 1)       # int
IdUtil.get_snowflake_next_id_str(1, 1)   # str

选择建议

方案

长度

有序性

适用场景

UUID

32

通用场景

NanoId

21(可配置)

短 ID、URL 安全

雪花 ID

18-19 位数字

有(时间有序)

数据库主键、分布式系统

机器唯一 ID

基于 PID + 主机名哈希 + 时间戳 + 计数器组合生成的唯一 ID,适合分布式环境下的节点标识:

from hutool import IdUtil

# 32 位机器唯一 ID(毫秒时间戳 12 位 + PID 8 位 + 计数器 12 位)
id32 = IdUtil.unique_machine32()    # 例如 287454212

# 64 位机器唯一 ID(含主机名哈希,跨机器唯一)
id64 = IdUtil.unique_machine64()    # 例如 1382741234567890

# 基于主机名的全局唯一 ID(适合 NFS 文件命名)
IdUtil.luid()                       # "A1B2C3D4-PID1234-60A1B2C3-0001"
IdUtil.luid(separator=":")          # "A1B2C3D4:PID1234:60A1B2C3:0001"

Verhoeff 校验位 ID

使用 Verhoeff 算法生成带校验位的业务 ID(位于 CheckUtil):

from hutool import CheckUtil

# 带前缀的 ID(数字部分补零到 6 位,末位为校验位)
CheckUtil.build_verhoeff_id("INV", 42, length=6)    # "INV000042X"(X 为校验位)
CheckUtil.build_verhoeff_id("ORD", 7, length=1)     # "ORD7X"
CheckUtil.build_verhoeff_id("T", 0, length=1)        # "T0X"

GUID128

生成 26 字符的全局唯一 ID,使用 Crockford Base32 编码:

from hutool import IdUtil

IdUtil.guid128()                    # "0DGHJKMNPQRSTVWXYZ0123456"
IdUtil.guid128(salt="my-salt")      # 带盐值的唯一 ID

全局单例管理器

from hutool.core.util.id import MachineIdGenerator

gen = MachineIdGenerator()
gen.generate32()    # 32 位 ID
gen.generate64()    # 64 位 ID