UUID v1、v4、v5:您应该使用哪个版本?
快速解答
默认使用 UUID v4(随机)——它不需要协调并且碰撞风险可以忽略不计。仅当您需要按时间排序的 ID 并且可以保护节点 ID 时,才使用 v1(基于时间)。当您需要从名称派生确定性 ID 时,请使用 v5(命名空间+名称)。使用我们的免费 UUID 生成器生成任何版本。
介绍
UUID(通用唯一标识符)是一个 128 位标识符,呈现为 8-4-4-4-12 十六进制组中的 36 个字符,例如123e4567-e89b-12d3-a456-426614174000。 RFC 9562定义了多个版本;您最常遇到的三个是 v1(时间 + MAC)、v4(随机)和 v5(命名空间 + 名称,SHA-1)。每个都在唯一性保证、可排序性和确定性之间做出不同的权衡。
步步
-
UUID v1 —基于时间和节点
v1 编码当前 60 位时间戳(自 1582 年 10 月 15 日以来的 100 ns 间隔)和 48 位节点 ID(通常是 MAC 地址)。同一节点上生成的 ID 是单调递增且可按时间排序的。风险:MAC 地址泄露硬件身份,节点之间的时钟偏差可能会破坏排序。
-
UUID v4 —随机
v4 使用 122 个随机位(版本/变体固定有 6 位)。对于 122 个随机位,2.71 万亿个 ID 之间发生冲突的概率为 50% — 对于任何实际工作负载,这种可能性实际上为零。 v4 不需要协调,也不会泄露主机信息,使其成为最安全的默认值。
-
UUID v5 — 命名空间和名称 (SHA-1)
v5 使用 SHA-1 对命名空间 UUID 和名称字符串进行哈希处理,以生成确定性的 128 位 ID。相同的(命名空间、名称)对始终生成相同的 UUID,这对于从自然键派生的重复数据删除和稳定 ID 来说是理想的选择。 v3 是相同的想法,但使用 MD5 (避免它)。
-
比较权衡
v1 是可排序的,但会泄漏 MAC 并且需要时钟同步。 v4 是随机且私有的,但不可排序。 v5 具有确定性和重复数据删除功能,但不是随机的 — 猜测名称可以让攻击者重现 UUID。根据您是否需要有序性、随机性或确定性进行选择。
-
选择适合您情况的版本
数据库主键:v4(或较新系统中的 v7,以实现时间排序)。没有协调的分布式系统:v4。来自自然键的确定性 ID(例如 URL →UUID):v5。受益于时间顺序的审核日志:带有安全随机节点 ID 的 v1。
示例
UUID v1(基于时间,可排序)
输入: 于 2026-08-28T12:00:00Z 在节点 00:11:22:33:44:55 上生成
输出: 1ef7c1d0-2d3b-11f0-8000-001122334455(版本数字“1”,可按时间排序)
UUID v4(随机)
输入: Random generation
输出: f47ac10b-58cc-4372-a567-0e02b2c3d479(版本数字“4”,随机位)
UUID v5(从命名空间+名称确定)
输入: 命名空间 DNS (6ba7b810-9dad-11d1-80b4-00c04fd430c8) + 名称 'freeonlinetoolsgo.com'
输出: 74738ff5-5367-5958-9aeb-0c1f1f1f1f1f(相同的输入始终产生相同的输出)
常见问题
- 将 UUID 存储为 VARCHAR(36),而不是本机 16 字节 BINARY/UUID 类型:这会浪费 2 倍的存储空间并破坏索引性能。如果可用,请使用本机 UUID 列类型。
- 在不保护节点 ID 的情况下使用 v1:默认 MAC 地址会泄露硬件身份,并且存在隐私问题。将其替换为每个节点的加密随机 48 位值。
- 假设 v4 碰撞是不可能的:事实并非如此——它们只是在天文数字上不太可能发生。对于 122 个随机位,您需要约 2.71 万亿个 ID 才能获得 50% 的机会。对于 10 亿个 ID,概率约为 0.0000000000000001。
- 使用 v3(基于 MD5)而不是 v5(基于 SHA-1):MD5 已损坏,因此首选 v5。两者都是确定性的,但v5具有更强的抗碰撞能力。
提示
- 几乎每个用例都默认使用 v4——它是随机的、私有的、碰撞安全的,无需任何协调。
- 如果您需要可按时间排序的随机 ID,请查看 UUID v7 (RFC 9562, 2024),它将 Unix 时间戳与随机位结合在一起 — 对于现代数据库来说,它比 v1 更好。
- 使用 v5 从自然键(URLs、电子邮件地址)生成稳定的 ID,因此相同的输入始终映射到相同的 UUID — 对于重复数据删除和幂等 APIs 很有用。
- 尽可能在客户端生成 UUID,以避免往返服务器 - 我们的 UUID 生成器完全使用 crypto.getRandomValues() 在浏览器中运行。