Java UUID如何生成使用?
- 后端开发
- 2025-07-06
- 6
在Java中,UUID(Universally Unique Identifier)是一种用于生成全局唯一标识符的标准,通常由32位十六进制数字组成(如550e8400-e29b-41d4-a716-446655440000),它广泛用于分布式系统中避免ID冲突,例如数据库主键、会话标识或文件命名,以下是详细使用指南:

生成UUID
Java通过java.util.UUID类提供原生支持,常用方法是生成随机UUID(版本4):
import java.util.UUID; public class UUIDExample { public static void main(String[] args) { // 生成随机UUID UUID uuid = UUID.randomUUID(); System.out.println("Generated UUID: " + uuid); // 输出示例:f47ac10b-58cc-4372-a567-0e02b2c3d479 } }
- 关键方法:
- UUID.randomUUID():生成版本4(随机)UUID(最常用)。
- UUID.nameUUIDFromBytes(byte[] name):基于名称生成版本3(MD5哈希)UUID(需传入字节数组)。
解析和操作UUID
字符串与UUID互转
// UUID转字符串 String uuidString = uuid.toString(); // 标准格式:550e8400-e29b-41d4-a716-446655440000 // 字符串转UUID UUID parsedUUID = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
- 注意:字符串必须符合8-4-4-4-12的十六进制格式,否则抛出IllegalArgumentException。
获取UUID的组成部分
long mostSignificantBits = uuid.getMostSignificantBits(); // 高64位 long leastSignificantBits = uuid.getLeastSignificantBits(); // 低64位
UUID版本的区别
| 版本 | 生成方式 | 特点 | 适用场景 |
|---|---|---|---|
| v1 | 时间戳+MAC地址 | 可排序,可能泄露隐私 | 历史遗留系统 |
| v3 | 基于名称的MD5哈希 | 确定性(相同输入相同输出) | 需要固定标识的场景 |
| v4 | 随机数生成(默认) | 高随机性,无隐私风险 | 绝大多数场景(推荐) |
| v5 | 基于名称的SHA-1哈希 | 比v3更安全 | 类似v3 |
Java原生仅支持v3和v4,v1/v5需第三方库(如java-uuid-generator)。
实际应用场景
-
数据库主键(替代自增ID):
@Entity public class User { @Id private UUID id; // 直接使用UUID类型(JPA支持) public User() { this.id = UUID.randomUUID(); // 生成唯一ID } }
-
文件/会话标识:
注意事项
- 存储效率:
- UUID占16字节(128位),比自增ID(4-8字节)更大,可能影响数据库性能。
- 可考虑用BINARY(16)替代CHAR(36)存储以节省空间。
- 无序性问题:
随机UUID无法排序,若需有序ID,可组合时间戳(如Snowflake算法)。
- 版本选择:
- 优先用v4(随机)确保安全性;v3/v5适用于需要固定标识的场景(如相同名称生成相同UUID)。
- Java通过UUID.randomUUID()可快速生成唯一标识符,适用于分布式系统、数据库主键等场景。
- 默认版本(v4)基于强随机数,冲突概率极低(约需生成26万亿个才可能重复)。
- 注意存储成本和性能影响,大型系统可结合其他方案(如ULID、Snowflake)。
参考:
- Oracle官方文档:java.util.UUID
- RFC 4122 UUID规范
- 实践建议:优先使用v4,避免依赖MAC地址的v1。

- 存储效率:
