这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
UUID 原理
UUID(Universally Unique Identifier)是一种广泛使用的唯一标识符标准。让我们深入了解 UUID 的原理和实现。
UUID 简介
1. 定义
UUID 是一个 128 位的数字,用于在计算机系统中标识信息。其标准格式为 32 个十六进制数字,用连字符分为 5 组。
格式示例:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
示例:
550e8400-e29b-41d4-a716-446655440000结构分解:
550e8400-e29b-41d4-a716-446655440000
↑ ↑ ↑ ↑ ↑
时间戳 版本 变体 节点
8-4-4-4-122. UUID 标准
UUID 由 RFC 4122 标准定义,包含多个版本:
| 版本 | 描述 | 特点 |
|---|---|---|
| UUID v1 | 基于时间和节点 | 包含时间戳和 MAC 地址 |
| UUID v2 | 基于 DCE 安全 | 包含用户标识符 |
| UUID v3 | 基于 MD5 命名 | 基于命名空间和名称 |
| UUID v4 | 随机生成 | 完全随机 |
| UUID v5 | 基于 SHA-1 命名 | 基于 SHA-1 哈希 |
| UUID v7 | 基于时间排序 | 时间有序(新标准) |
UUID v1:基于时间和节点
1. 组成结构
时间低位 (32位)
时间中位 (16位)
时间高位和版本 (16位)
时钟序列和变体 (16位)
节点标识符 (48位)示例分解:
550e8400-e29b-11d4-a716-446655440000
│ │ │ │ │
└── 60位时间戳
└─ 版本 (1)
└─ 13位时钟序列 + 变体
└─ 48位 MAC 地址2. 生成过程
3. 特点
优点:
- ✅ 时间有序(同一机器内)
- ✅ 生成速度快
- ✅ 无需协调
缺点:
- ❌ 暴露 MAC 地址(隐私问题)
- ❌ 时钟回拨可能导致重复
- ❌ 不同机器间无序
UUID v4:随机生成
1. 组成结构
随机位 (122位)
版本标识 (4位)
变体标识 (2位)示例分解:
f47ac10b-58cc-4372-a567-0e02b2c3d479
│ │ │ │ │
└── 48位随机
└─ 版本 (4)
└─ 变体
└─ 62位随机2. 生成过程
3. 碰撞概率
计算公式:
碰撞概率 ≈ n² / (2 × 2¹²²)
其中 n 是生成的 UUID 数量碰撞概率示例:
生成 10亿个 UUID:
碰撞概率 ≈ (10⁹)² / (2 × 2¹²²)
≈ 10¹⁸ / (2 × 5.3 × 10³⁶)
≈ 0结论:
- 理论上有碰撞可能
- 实际上碰撞概率趋近于零
- 可以认为完全唯一
4. 特点
优点:
- ✅ 完全唯一
- ✅ 无需协调
- ✅ 生成速度快
- ✅ 分布式友好
缺点:
- ❌ 完全无序
- ❌ 较长(36字符)
- ❌ 存储空间大
UUID v7:基于时间排序
1. 背景
UUID v7 是 2024 年新提出的标准,专门解决 UUID 无序的问题。
2. 组成结构
Unix 时间戳 (48位)
版本标识 (4位)
随机位 (74位)
变体标识 (2位)示例分解:
0189dcd0-3e45-7123-8b5e-123456789abc
│ │ │ │ │
└── 48位时间戳
└─ 版本 (7)
└─ 随机位
└─ 变体3. 生成过程
4. 特点
优点:
- ✅ 时间有序
- ✅ 完全唯一
- ✅ 无需协调
- ✅ 存储空间小(19位)
缺点:
- ❌ 较新标准,兼容性可能有问题
使用示例
Java
Python
Go
UUID 的应用场景
适合使用 UUID 的场景
- 分布式系统:无需中央协调
- 消息 ID:消息追踪和去重
- 会话 ID:用户会话标识
- 日志追踪:请求追踪 ID
- 临时文件:临时文件命名
- 数据库主键:当有序性不重要时
不适合使用 UUID 的场景
- 订单号:需要可读和有序
- 用户 ID:需要短小和有序
- 支付流水:需要可追溯
- URL 短链:需要短小
下一步
了解了 UUID 的原理后,我们分析它的优缺点。