什么是UUID v3
UUID v3 是确定性生成的:它把命名空间 UUID 和名称拼在一起做 MD5 哈希,再写入版本号和变体号。同一个命名空间加同一个名称,永远得到同一个 UUID,任何机器上都是如此。
MD5 在这里不是用来保密的,哈希本身并不是加密操作。需要注意 MD5 的抗碰撞性已被攻破 —— 如果名称可能被恶意构造,请改用基于 SHA-1 的 v5。
使用方法
- 在下拉框里选择 v3。
- 选择命名空间:DNS、URL、OID 或 X500。
- 输入名称,例如
example.com。 - 点击生成 UUID,之后重复同样输入会得到相同结果。
适用场景
- 从域名或 URL 推导出稳定的标识符。
- 需要长期保持一致的数据迁移映射。
- 与仍然使用 v3 的既有系统对接。
结构
先按命名空间的字节序拼接名称,再对整个序列做 MD5,取前 128 位并写入版本号(3)和变体号。
UUID v3 的定位
| 选项 | 何时使用 |
|---|---|
v3 | MD5:快速且确定性,新设计不推荐 |
v5 | 同一思路的 SHA-1 版本,新项目应选它 |
v4 | 随机;不需要同一输入得到同一标识符时用它 |
UUID 各版本速查表
| 版本 | 可排序 | 数据来源 | 适合的场景 |
|---|---|---|---|
| v1 | 不可以 | 时间戳 + MAC 地址 | 仍在依赖 v1 的既有系统 |
| v3 | 不可以 | 名称的 MD5 哈希 | 必须使用 MD5 时的确定性标识符 |
| v4 | 不可以 | 122 位随机数 | 绝大多数普通的唯一标识需求 |
| v5 | 不可以 | 名称的 SHA-1 哈希 | 需要同一名称始终得到同一标识符 |
| v6 | 可以 | 重排后的时间戳 | 既要随机性又要便于排序 |
| v7 | 可以 | 毫秒精度的 Unix 时间 | 数据库主键和事件标识符 |
| v8 | 不可以 | 自定义位布局 | 专有格式和实验性用途 |
这七个版本都是 128 位,都用同样的 8-4-4-4-12 写法表示,区别只在于各个位代表什么。
代码示例
javascript
// 需自行实现 MD5,Web Crypto 不提供
// mdn-polyfills 或第三方库
python
import uuid
id = str(uuid.uuid3(uuid.NAMESPACE_DNS, "example.com"))
java
UUID id = UUID.nameUUIDFromBytes("example.com".getBytes());
常见问题
v3 是加密安全的吗?
不是。MD5 的抗碰撞性早已被攻破,攻击者可以构造出两个不同的名称得到同一个 UUID。它只适合做标识,不能用来做安全校验。
为什么同一个名称总是得到同一个 UUID?
因为这正是设计目的。v3 不包含随机数或时间,结果完全由命名空间和名称决定,所以是可复现的。
该用 v3 还是 v5?
新项目用 v5。除非你已经有 v3 数据、必须与之保持一致。