上一篇
Java UUID如何生成使用?
- 后端开发
- 2025-07-06
- 4
Java中使用
java.util.UUID
类生成唯一标识符,调用
UUID.randomUUID()
获取随机UUID,或通过
UUID.nameUUIDFromBytes()
基于名称生成,常用
toString()
转为32位十六进制字符串(含连字符),适用于分布式ID、会话标识等场景。
在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 } }
-
文件/会话标识:
String fileName = "image_" + UUID.randomUUID() + ".png"; // 唯一文件名 String sessionToken = UUID.randomUUID().toString().replace("-", ""); // 无连字符的Token
注意事项
- 存储效率:
- 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
。