java.util.UUID
类的randomUUID()
方法即可,示例代码:UUID uuid = UUID.randomUUID();
,调用uuid.toString()
可转为标准36位字符串格式(如”123e4567-e89b-12d3-a456-426614174000″)。核心方法:使用java.util.UUID
Java标准库提供了java.util.UUID
类,直接调用其静态方法即可生成UUID:
import java.util.UUID; public class UUIDGenerator { public static void main(String[] args) { // 生成随机UUID (版本4) UUID uuid = UUID.randomUUID(); System.out.println("Generated UUID: " + uuid); } }
输出示例:Generated UUID: f47ac10b-58cc-4372-a567-0e02b2c3d479
不同版本UUID的生成
UUID有多个版本,Java默认支持版本3、4和5:
-
版本4(随机生成) – 最常用
基于随机数生成,符合RFC 4122标准:UUID uuid4 = UUID.randomUUID(); // 直接调用
-
版本3/5(基于名称生成)
通过指定命名空间和名称生成确定性UUID(相同输入生成相同输出):// 使用命名空间(如DNS)和名称生成版本3 UUID namespaceDNS = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8"); UUID uuid3 = UUID.nameUUIDFromBytes("example.com".getBytes()); // 版本5需自定义实现(Java标准库未直接提供)
关键特性与注意事项
-
唯一性保证
- 版本4使用122位随机数,重复概率极低(约每秒生成10亿个UUID,100年后重复概率50%)。
- 版本3/5通过哈希算法(MD5/SHA-1)保证相同输入生成相同UUID。
-
格式与长度
所有UUID均为36字符(32字符+4连字符),123e4567-e89b-12d3-a456-426614174000
-
性能与线程安全
UUID.randomUUID()
内部使用SecureRandom
,线程安全。- 高并发场景下建议测试性能(单机每秒可生成百万级UUID)。
-
应用场景建议
| 版本 | 适用场景 | 注意事项 |
|——–|———————————|———————|
| v4 | 会话ID、数据库主键、日志追踪 | 首选,无需协调 |
| v3/v5 | 需要固定UUID的映射(如文件校验) | 避免MD5/SHA-1碰撞风险 |
常见问题解决
-
去除连字符
如需紧凑格式,移除连字符:String cleanUUID = uuid.toString().replace("-", ""); // 输出:f47ac10b58cc4372a5670e02b2c3d479
-
大端序字节转换
转换为字节数组存储:byte[] bytes = new byte[16]; System.arraycopy( ByteBuffer.wrap(new byte[16]) .putLong(uuid.getMostSignificantBits()) .array(), 0, bytes, 0, 8); System.arraycopy( ByteBuffer.wrap(new byte[16]) .putLong(uuid.getLeastSignificantBits()) .array(), 0, bytes, 8, 8);
-
数据库存储优化
- MySQL: 使用
BINARY(16)
类型存储,比CHAR(36)
节省空间。 - PostgreSQL: 内置
uuid
类型,支持高效查询。
- MySQL: 使用
为什么推荐版本4?
- 无需协调:分布式系统独立生成,无需中央授权。
- 安全性:使用密码学强随机数生成器(CSPRNG)。
- 兼容性:所有语言和数据库均支持RFC 4122标准。
注意:避免用UUID替代自增ID(如MySQL的InnoDB主键),可能因随机写入导致性能下降。
Java生成UUID只需一行代码:UUID.randomUUID()
,版本4满足绝大多数场景,需注意存储优化和性能影响,在需要确定性映射时选择版本3/5,但需评估哈希碰撞风险。
引用说明:
- Oracle官方文档 – java.util.UUID
- RFC 4122: UUID规范
- 数据库存储建议参考MySQL/PostgreSQL官方手册。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/47370.html