UUID(Universally Unique Identifier)共有 5个标准版本(v1-v5),每个版本使用不同的生成策略。以下是各版本的详细说明:
UUID版本总览
版本 | 生成原理 | 唯一性依据 | 格式示例 | 安全性 |
---|---|---|---|---|
v1 | 时间戳 + MAC地址 | 时间+机器唯一性 | d5a87e71-1c23-11ef-bdf8-325096b39f47 | 低(隐私泄露) |
v2 | DCE安全扩展(罕见) | 时间+本地标识符 | 类似v1,部分替换为UID/GID | 中 |
v3 | 命名空间+名称的MD5哈希 | 输入相同则输出相同 | 6fa459ea-ee8a-3ca4-894e-db77e160355e | 中(MD5弱点) |
v4 | 完全随机数(主流版本) | 随机性概率 | 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d | 高 |
v5 | 命名空间+名称的SHA-1哈希 | 输入相同则输出相同 | 74738ff5-5367-5958-9aee-98fffdcd1876 | 高 |
详细解析各版本
1. UUID v1(基于时间)
- 生成逻辑:
UUID = 时间戳(60位) + 时钟序列(14位) + MAC地址(48位)
- 特点:
- 前6段为时间戳(精确到100纳秒)
- 第7段为时钟序列(防止时钟回拨冲突)
- 最后12位为机器MAC地址
- 问题:
- 隐私泄露:暴露生成时间和物理设备地址
- 可预测性:时间戳连续可被推算
2. UUID v2(DCE安全扩展)
- 改进点:
- 替换v1的部分字段为本地标识符(如用户UID/组GID)
- 结构:
时间戳 + 本地标识符 + 时钟序列 + 域标识符
- 现状:
- 极少使用(RFC标准未明确定义)
- 仅见于旧版DCE系统
3. UUID v3(基于命名空间的MD5哈希)
- 生成逻辑:
namespace = UUID("6ba7b810-9dad-11d1-80b4-00c04fd430c8") # DNS命名空间 name = "example.com" UUID = md5(namespace.bytes + name.encode()).to_uuid(version=3)
- 特点:
- 确定性:相同命名空间+名称生成相同UUID
- 使用MD5哈希(128位),存在碰撞风险
- 常用命名空间:
- DNS:
6ba7b810-9dad-11d1-80b4-00c04fd430c8
- URL:
6ba7b811-9dad-11d1-80b4-00c04fd430c8
4. UUID v4(随机生成 - 最推荐)
- 生成逻辑:
random_bytes = os.urandom(16) random_bytes[6] = (random_bytes[6] & 0x0F) | 0x40 # 设置版本号4 random_bytes[8] = (random_bytes[8] & 0x3F) | 0x80 # 设置变体位 UUID = bytes_to_uuid(random_bytes)
- 特点:
- 122位纯随机数(其余6位为固定标志位)
- 冲突概率极低:每秒生成10亿个UUID,约需100年才有50%碰撞概率
- 无隐私泄露:不包含机器信息
5. UUID v5(基于命名空间的SHA-1哈希)
- 生成逻辑:
namespace = UUID("6ba7b810-9dad-11d1-80b4-00c04fd430c8") # DNS命名空间 name = "example.com" UUID = sha1(namespace.bytes + name.encode()).digest()[:16].to_uuid(version=5)
- 改进:
- 用SHA-1哈希(160位截取128位)替代MD5,抗碰撞性更强
- 其他特性与v3相同(确定性输出)
关键区别对比
特性 | v1 | v3/v5 | v4 |
---|---|---|---|
唯一性依据 | 时间+硬件 | 输入名称 | 随机数 |
可预测性 | 高(时间连续) | 中(依赖输入) | 极低 |
隐私安全 | 低(暴露MAC) | 中(暴露命名) | 高 |
主要用途 | 历史遗留系统 | 固定映射标识符 | 通用唯一标识符 |
版本号位置(重要!)
所有UUID的第13个十六进制字符标识版本:
xxxxxxxx-xxxx-**V**xxx-xxxx-xxxxxxxxxxxx
V=1
→ v1V=3
→ v3V=4
→ v4V=5
→ v5
使用建议
- 通用场景:优先选择 v4(完全随机),如用户ID、会话Token
- 需要可重现ID:选择 v5(如生成相同资源的固定ID)
- 绝对避免:v1(隐私风险)、v2(兼容性差)、v3(MD5安全隐患)