UUID各个版本的区别

发布于 2025年7月2日

本文内容由AI生成并经过人工精选,不保证100%准确,请酌情参考使用

UUID(Universally Unique Identifier)共有 5个标准版本(v1-v5),每个版本使用不同的生成策略。以下是各版本的详细说明:


UUID版本总览

版本生成原理唯一性依据格式示例安全性
v1时间戳 + MAC地址时间+机器唯一性d5a87e71-1c23-11ef-bdf8-325096b39f47低(隐私泄露)
v2DCE安全扩展(罕见)时间+本地标识符类似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相同(确定性输出)

关键区别对比

特性v1v3/v5v4
唯一性依据时间+硬件输入名称随机数
可预测性高(时间连续)中(依赖输入)极低
隐私安全低(暴露MAC)中(暴露命名)
主要用途历史遗留系统固定映射标识符通用唯一标识符

版本号位置(重要!)

所有UUID的第13个十六进制字符标识版本:

xxxxxxxx-xxxx-**V**xxx-xxxx-xxxxxxxxxxxx
  • V=1 → v1
  • V=3 → v3
  • V=4 → v4
  • V=5 → v5

使用建议

  1. 通用场景:优先选择 v4(完全随机),如用户ID、会话Token
  2. 需要可重现ID:选择 v5(如生成相同资源的固定ID)
  3. 绝对避免:v1(隐私风险)、v2(兼容性差)、v3(MD5安全隐患)
UUID各个版本的区别