← 返回博客

UUID v4 vs v1 vs v5 版本区别详解

2026-04-03 · 5 分钟阅读

UUID v1:基于时间和 MAC 地址

UUID v1 使用当前时间戳(精确到 100 纳秒)和节点的 MAC 地址来生成 UUID。时间戳从 1582 年 10 月 15 日(格里高利历改革日期)起算,存储在 UUID 的 time_low、time_mid 和 time_hi 字段中。由于包含时间戳,UUID v1 是单调递增的(同一节点上生成的 UUID 按生成时间排序)。这使 v1 非常适合需要按时间排序的场景,但也带来隐私问题:UUID 中嵌入了 MAC 地址,可能泄露生成机器的身份信息。

UUID v4:完全随机

UUID v4 使用密码学安全的随机数生成器填充 128 位,仅设置版本字段(第三组高 4 位为 0100)和变体字段(第四组高 2 位为 10)。这意味着 v4 UUID 实际上有 122 位随机信息。优点:生成简单、没有隐私泄露风险、不依赖硬件信息。缺点:没有时间顺序,在数据库 B-Tree 索引中会导致频繁的页分裂(随机插入降低性能)。v4 是目前使用最广泛的 UUID 版本,绝大多数应用场景的默认选择。

UUID v3 和 v5:命名空间 UUID

UUID v3 和 v5 都是"命名空间 UUID",即从固定命名空间和名称派生出确定性 UUID(相同输入总是得到相同输出)。区别在于哈希算法:v3 使用 MD5,v5 使用 SHA-1。由于 MD5 已被认为不安全,推荐优先使用 v5。常见用途:为 URL 生成唯一 ID(同一 URL 始终映射到同一 UUID);为 DNS 名称生成稳定标识符;在内容寻址存储系统中使用。RFC 4122 预定义了几个标准命名空间:DNS、URL、OID、X.500。

UUID v7:新一代可排序 UUID

UUID v7 是 RFC 9562(2024年发布)定义的新版本,结合了 v1 的时间有序性和 v4 的随机性:高 48 位是 Unix 毫秒时间戳,低 74 位是随机数据(加上版本和变体位)。v7 UUID 按生成时间自然排序,不泄露 MAC 地址,非常适合用作数据库主键。与 v1 相比,v7 的时间精度更高(毫秒级),且使用 Unix 时间戳(更直观),支持直接提取生成时间。越来越多的库开始支持 v7,推荐在新项目中优先考虑 v7 代替 v1。

各版本的碰撞风险

UUID v1 的碰撞风险最低(理论上同一节点、同一时间点生成的 v1 UUID 是唯一的,时钟序列字段用于处理时间回退的情况);UUID v4 有 122 位随机性,碰撞概率极低(在 10 亿个 UUID 中,发生第一次碰撞的概率约为 10^-18);UUID v5 对于相同输入总是产生相同输出,因此两个不同的(命名空间, 名称)组合发生碰撞的概率极低,但相同输入不构成碰撞(是特性而非缺陷)。实际应用中,任何版本的碰撞风险都可以忽略不计。

如何选择合适的版本

选择建议:通用场景(如应用 ID、资源 ID)→ UUID v4;数据库主键(需要索引性能)→ UUID v7(新项目)或有序 UUID 方案;需要确定性 ID(相同输入相同输出)→ UUID v5;需要从 UUID 中提取生成时间 → UUID v7 或 v1;有隐私要求(避免泄露机器信息)→ 避免使用 v1,选择 v4 或 v7。大多数现代编程语言的标准库已支持 v4,v7 支持在各主流语言库中也在快速普及。

代码示例:各版本生成

# Python
import uuid

# UUID v1 (基于时间+MAC)
print(uuid.uuid1())

# UUID v4 (随机)
print(uuid.uuid4())

# UUID v5 (命名空间 + 名称)
print(uuid.uuid5(uuid.NAMESPACE_URL, 'https://example.com'))

# UUID v3 (MD5)
print(uuid.uuid3(uuid.NAMESPACE_DNS, 'example.com'))

# Node.js (v4 内置, v7 需要第三方库)
const { randomUUID } = require('crypto');
console.log(randomUUID()); // UUID v4

// uuid npm 包支持所有版本
const { v1, v4, v5, v7 } = require('uuid');
console.log(v7());

立即免费使用相关工具

免费使用 →