ID生成工具-IdUtil
# 📦 ID生成工具-IdUtil
IdUtil 是 Hutool 提供的 ID 生成工具类,封装了多种 ID 生成策略,包括 UUID、ObjectId、Snowflake、NanoId 等,满足不同场景下的 ID 生成需求。
# 🔧 核心功能
| 生成策略 | 特点 | 适用场景 |
|---|---|---|
| UUID | 全球唯一,无需中心化管理 | 分布式系统、随机标识符 |
| ObjectId | 时间有序,包含机器和进程信息 | MongoDB文档ID、需要时间排序的场景 |
| Snowflake | 时间有序,高性能,可预测 | 分布式系统、高并发场景、需要排序的ID |
| NanoId | 短长度,高安全性,可定制 | URL缩短、资源标识符、需要短ID的场景 |
| ULID | 时间有序,URL安全,无特殊字符 | 需要排序且URL友好的场景 |
# 🎯 方法示例
# 1. UUID 生成
// 获取标准UUID (带横线)
String uuid = IdUtil.randomUUID();
// 示例: 550e8400-e29b-41d4-a716-446655440000
// 获取简化UUID (不带横线)
String simpleUuid = IdUtil.simpleUUID();
// 示例: 550e8400e29b41d4a716446655440000
// 获取快速UUID (性能更好)
String fastUuid = IdUtil.fastUUID();
// 示例: 550e8400-e29b-41d4-a716-446655440000
// 获取快速简化UUID
String fastSimpleUuid = IdUtil.fastSimpleUUID();
// 示例: 550e8400e29b41d4a716446655440000
// 获取UUID7
String uuid7 = IdUtil.randomUUID7();
// 示例: 018d8e8a-3b4c-7d8e-9f0a-1b2c3d4e5f6g
# 2. ObjectId 生成
// 生成MongoDB风格的ObjectId
String objectId = IdUtil.objectId();
// 示例: 60b8d295c817e62d30c5d5a1
# 3. Snowflake 算法
// 获取默认Snowflake实例
Snowflake snowflake = IdUtil.getSnowflake();
// 生成雪花ID
long snowflakeId = snowflake.next();
// 示例: 1234567890123456789
// 生成雪花ID字符串
String snowflakeIdStr = snowflake.nextStr();
// 示例: "1234567890123456789"
// 快速生成雪花ID
long nextId = IdUtil.getSnowflakeNextId();
// 示例: 1234567890123456789
// 快速生成雪花ID字符串
String nextIdStr = IdUtil.getSnowflakeNextIdStr();
// 示例: "1234567890123456789"
// 自定义workerId和datacenterId
Snowflake customSnowflake = IdUtil.getSnowflake(1, 1);
long customId = customSnowflake.next();
# 4. NanoId 生成
// 生成默认长度(21位)的NanoId
String nanoId = IdUtil.nanoId();
// 示例: "9bHa5aZaQ3Kd8eRfTgYhUj"
// 生成指定长度的NanoId
String customLengthNanoId = IdUtil.nanoId(10);
// 示例: "9bHa5aZaQ3"
# 5. SeataSnowflake 生成
// 获取默认SeataSnowflake实例
SeataSnowflake seataSnowflake = IdUtil.getSeataSnowflake();
// 生成Seata雪花ID
long seataId = seataSnowflake.next();
// 示例: 1234567890123456789
// 生成Seata雪花ID字符串
String seataIdStr = seataSnowflake.nextStr();
// 示例: "1234567890123456789"
// 快速生成Seata雪花ID
long seataNextId = IdUtil.getSeataSnowflakeNextId();
// 示例: 1234567890123456789
// 快速生成Seata雪花ID字符串
String seataNextIdStr = IdUtil.getSeataSnowflakeNextIdStr();
// 示例: "1234567890123456789"
# 🔍 详细说明
# 1. UUID 生成
UUID (Universally Unique Identifier) 是一种全球唯一标识符,由 36 个字符组成,包含 32 个十六进制数字和 4 个横线。
randomUUID(): 生成标准 UUID,带横线simpleUUID(): 生成简化 UUID,去掉横线,长度 32fastUUID(): 使用性能更好的ThreadLocalRandom生成 UUIDfastSimpleUUID(): 结合快速生成和简化格式的 UUIDrandomUUID7(): 生成 UUID v7,基于时间的 UUID,具有更好的索引性能
# 2. ObjectId 生成
ObjectId 是 MongoDB 使用的一种 ID 生成策略,由 12 字节组成:
- 4 字节:时间戳(秒)
- 3 字节:机器标识符
- 2 字节:进程 ID
- 3 字节:计数器
特点:
- 时间有序,便于索引
- 包含机器和进程信息,确保分布式环境下的唯一性
- 长度固定,12 字节(24 个十六进制字符)
# 3. Snowflake 算法
Snowflake 是 Twitter 开源的分布式 ID 生成算法,ID 结构如下:
0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
- 1 位:未使用(符号位)
- 41 位:时间戳(毫秒级,可使用 69 年)
- 5 位:数据中心 ID(最多支持 32 个数据中心)
- 5 位:机器 ID(最多支持 32 台机器)
- 12 位:毫秒内序列号(每台机器每秒最多生成 4096 个 ID)
特点:
- 时间有序,便于排序和索引
- 高性能,每台机器每秒可生成数百万个 ID
- 分布式友好,支持多节点部署
- 可预测性,ID 按时间递增
Hutool 提供了多种获取 Snowflake 实例的方式:
getSnowflake(): 获取默认实例(自动生成 workerId 和 datacenterId)getSnowflake(workerId): 指定 workerId,datacenterId 自动生成getSnowflake(workerId, datacenterId): 完全自定义 workerId 和 datacenterId
# 4. NanoId 生成
NanoId 是一种新型的 ID 生成策略,具有以下特点:
- 短长度:默认 21 个字符,比 UUID 短 40%
- 高安全性:使用加密安全的随机数生成器
- 可定制:可以自定义长度和字符集
- URL 友好:不使用特殊字符,适合 URL 缩短
nanoId() 方法生成默认长度(21 位)的 NanoId,nanoId(int size) 方法可以生成指定长度的 NanoId。
# 5. SeataSnowflake 生成
SeataSnowflake 是 Seata 分布式事务框架使用的 Snowflake 变体,主要区别在于:
- 使用 64 位 ID,去掉了符号位限制
- 时间戳精度更高
- 节点 ID 管理更灵活
适合在 Seata 分布式事务环境中使用,确保全局事务 ID 的唯一性和有序性。
# 📋 注意事项
- UUID 的性能:标准 UUID 生成性能较低,在高并发场景下建议使用
fastUUID() - Snowflake 的时钟回拨:Snowflake 算法依赖系统时钟,时钟回拨可能导致 ID 重复,Hutool 已做了相应处理
- Snowflake 的节点 ID 管理:在分布式环境中,需要确保每个节点的 workerId 和 datacenterId 唯一
- ObjectId 的时间精度:ObjectId 基于秒级时间戳,同一秒内生成的 ID 无法通过时间戳区分顺序
- NanoId 的唯一性:虽然 NanoId 碰撞概率极低,但在极端情况下仍有可能发生碰撞,建议根据实际场景选择合适的长度
# 🚀 最佳实践
- 高并发场景:优先选择 Snowflake 或 SeataSnowflake
- 需要短 ID:选择 NanoId 或 ULID
- 需要时间排序:选择 ObjectId、Snowflake 或 ULID
- URL 友好:选择 NanoId 或 ULID
- 无需排序:选择 UUID 或 NanoId
# 💡 扩展阅读
- UUID 规范 (opens new window)
- Snowflake 算法原理 (opens new window)
- NanoId 项目 (opens new window)
- ULID 规范 (opens new window)
通过 IdUtil,可以轻松实现各种 ID 生成策略,满足不同场景下的 ID 生成需求,提高开发效率和系统可靠性。