# UUID生成器使用说明 ## 概述 本项目提供了完整的UUID生成工具,特别支持基于SHA-1哈希的UUID V5(确定性UUID)。 ## 文件结构 ``` src/main/java/com/caiji/uls/utils/uuid/ ├── UuidV5Generator.java # UUID V5核心生成器 └── UuidUtil.java # UUID通用工具类 src/main/java/com/caiji/uls/controller/ └── UuidTestController.java # 测试控制器 ``` ## UUID V5特性 UUID V5的主要特点: - **确定性**:相同的命名空间和名称总是生成相同的UUID - **可重现**:不需要存储UUID,可以随时重新生成 - **唯一性**:不同名称生成不同的UUID - **基于SHA-1**:使用SHA-1哈希算法确保分布均匀 ## 主要功能 ### 1. 生成随机UUID(V4) ```java // 标准格式(带横杠) String uuid = UuidUtil.generateRandomUuid(); // 输出: 550e8400-e29b-41d4-a716-446655440000 // 不带横杠 String uuid = UuidUtil.generateRandomUuidWithoutHyphens(); // 输出: 550e8400e29b41d4a716446655440000 ``` ### 2. 生成UUID V5(基础用法) ```java // 使用默认URL命名空间 String uuid = UuidUtil.generateUuidV5("example-name"); // 使用自定义命名空间 UUID customNamespace = UUID.fromString("12345678-1234-5678-1234-567812345678"); String uuid = UuidUtil.generateUuidV5(customNamespace, "example-name"); ``` ### 3. 基于用户信息生成确定性UUID ```java // 基于用户名 String userUuid = UuidUtil.generateUserUuid("john_doe"); // 基于邮箱 String emailUuid = UuidUtil.generateEmailUuid("john@example.com"); // 基于手机号 String phoneUuid = UuidUtil.generatePhoneUuid("13800138000"); ``` **重要**:同一用户信息始终生成相同的UUID,适合用作稳定的用户标识符。 ### 4. 使用UUID V5生成器的高级功能 ```java // DNS命名空间 UUID dnsUuid = UuidV5Generator.generateFromDns("example.com"); // URL命名空间 UUID urlUuid = UuidV5Generator.generateFromUrl("https://example.com"); // OID命名空间 UUID oidUuid = UuidV5Generator.generateFromOid("1.2.3.4"); // X.500命名空间 UUID x500Uuid = UuidV5Generator.generateFromX500("CN=John Doe, O=Example"); ``` ### 5. 验证UUID格式 ```java // 验证UUID格式 boolean isValid = UuidUtil.isValidUuid("550e8400-e29b-41d4-a716-446655440000"); // 获取UUID版本 int version = UuidUtil.getUuidVersion("550e8400-e29b-41d4-a716-446655440000"); // 返回: 4 (表示UUID V4) ``` ## API接口示例 启动应用后,可以使用以下API接口测试UUID生成功能: ### 生成随机UUID ``` GET /api/uuid/random ``` ### 生成UUID V5 ``` GET /api/uuid/v5?name=test-user ``` ### 基于用户名生成UUID ``` GET /api/uuid/user?username=john_doe ``` ### 基于邮箱生成UUID ``` GET /api/uuid/email?email=john@example.com ``` ### 验证UUID格式 ``` GET /api/uuid/validate?uuid=550e8400-e29b-41d4-a716-446655440000 ``` ### 演示UUID V5的确定性 ``` GET /api/uuid/v5/deterministic?name=test ``` 此接口会多次生成相同名称的UUID,证明其确定性特征。 ### 不同命名空间对比 ``` GET /api/uuid/v5/namespaces?name=example ``` 展示相同名称在不同命名空间下生成的不同UUID。 ## 应用场景 ### 1. 用户ID生成 ```java // 为用户生成稳定的ID String userId = UuidUtil.generateUserUuid(username); // 即使用户注册多次,只要用户名相同,ID就相同 ``` ### 2. 数据迁移 ```java // 从旧系统迁移时,可以基于原有标识生成新UUID String legacyId = "user_12345"; String newUuid = UuidUtil.generateUuidV5("legacy:" + legacyId); ``` ### 3. 分布式系统 ```java // 在微服务中,基于业务键生成一致的UUID String orderUuid = UuidUtil.generateUuidV5("order:" + orderNumber); ``` ### 4. 缓存键生成 ```java // 生成确定性的缓存键 String cacheKey = UuidUtil.generateUuidV5("cache:user:" + userId); ``` ## UUID版本对比 | 版本 | 类型 | 特点 | 适用场景 | |------|------|------|----------| | V1 | 时间戳 | 基于时间和MAC地址 | 需要时间排序的场景 | | V3 | MD5哈希 | 基于MD5(不安全) | 不推荐使用 | | V4 | 随机 | 完全随机 | 大多数通用场景 | | V5 | SHA-1哈希 | 确定性、可重现 | 需要稳定标识的场景 | ## UUID V5命名空间 RFC 4122定义了4个标准命名空间: 1. **DNS** (`6ba7b810-9dad-11d1-80b4-00c04fd430c8`) - 用于域名系统 2. **URL** (`6ba7b811-9dad-11d1-80b4-00c04fd430c8`) - 用于统一资源定位符(默认) 3. **OID** (`6ba7b812-9dad-11d1-80b4-00c04fd430c8`) - 用于对象标识符 4. **X.500** (`6ba7b814-9dad-11d1-80b4-00c04fd430c8`) - 用于X.500区分名称 ## 最佳实践 1. **选择合适的命名空间** - URL命名空间适合Web应用 - DNS命名空间适合域名相关 - 自定义命名空间适合特定业务 2. **使用前缀区分类型** ```java // 推荐:添加前缀以区分不同类型的标识 String userUuid = UuidUtil.generateUuidV5("user:" + username); String orderUuid = UuidUtil.generateUuidV5("order:" + orderNumber); ``` 3. **保持一致性** - 一旦选择了命名空间和命名规则,不要随意更改 - 否则会导致生成的UUID不一致 4. **安全性考虑** - UUID V5不是加密安全的 - 如果需要不可预测的ID,使用UUID V4 - UUID V5适合公开或非敏感的标识符 ## 技术实现 UUID V5的生成过程: 1. 将命名空间UUID转换为16字节数组 2. 将名称字符串转换为UTF-8字节数组 3. 拼接命名空间字节和名称字节 4. 计算SHA-1哈希值 5. 取前16字节作为UUID 6. 设置版本号为5 7. 设置变体位为RFC 4122标准 ## 性能说明 - UUID V5生成涉及SHA-1哈希计算,比V4稍慢 - 但对于大多数应用场景,性能差异可以忽略 - SHA-1在此场景下仅用于生成哈希,不涉及安全认证