什么是UUID v5
UUID v5 的生成方式和 v3 相同,只是把 MD5 换成了 SHA-1。命名空间和名称先被拼接,再做哈希,然后写入版本号和变体号。
同一个命名空间和名称,在任何语言、任何平台上都得到同一个 UUID,这让它非常适合给外部实体 —— 域名、URL、URL 中的对象 —— 分配一个稳定且不会互相冲突的标识符。
使用方法
- 在下拉框里选择 v5。
- 选择命名空间(域名通常选 DNS)。
- 输入名称,然后点击生成 UUID。
- 同样的输入重复生成,结果始终一致。
适用场景
- 给域名、URL 或消息体分配稳定的标识符。
- 多个系统需要在不事先通信的情况下算出同一个 ID。
- 幂等导入:重复处理同一条记录不会产生新标识符。
结构
拼接命名空间字节和名称的 UTF-8 字节,做 SHA-1 哈希,取前 128 位,再写入版本号(5)和变体号。
UUID v5 的定位
| 选项 | 何时使用 |
|---|---|
v5 | SHA-1:名称推导的推荐版本 |
v3 | 同一思路的 MD5 版本,只在必须兼容旧值时使用 |
v4 | 随机;不需要可复现的标识符时用它 |
UUID 各版本速查表
| 版本 | 可排序 | 数据来源 | 适合的场景 |
|---|---|---|---|
| v1 | 不可以 | 时间戳 + MAC 地址 | 仍在依赖 v1 的既有系统 |
| v3 | 不可以 | 名称的 MD5 哈希 | 必须使用 MD5 时的确定性标识符 |
| v4 | 不可以 | 122 位随机数 | 绝大多数普通的唯一标识需求 |
| v5 | 不可以 | 名称的 SHA-1 哈希 | 需要同一名称始终得到同一标识符 |
| v6 | 可以 | 重排后的时间戳 | 既要随机性又要便于排序 |
| v7 | 可以 | 毫秒精度的 Unix 时间 | 数据库主键和事件标识符 |
| v8 | 不可以 | 自定义位布局 | 专有格式和实验性用途 |
这七个版本都是 128 位,都用同样的 8-4-4-4-12 写法表示,区别只在于各个位代表什么。
代码示例
javascript
// 需引入 SHA-1 实现,Web Crypto 只提供异步接口
python
import uuid
id = str(uuid.uuid5(uuid.NAMESPACE_DNS, "example.com"))
csharp
// .NET 目前仍只提供第三方实现
常见问题
v5 是加密安全的吗?
SHA-1 的抗碰撞性已被削弱,在对抗性场景下不应作为安全边界,但用来生成标识符是完全够用的。如果名称由攻击者控制,请考虑加长输入或改用 HMAC。
v5 会重复吗?
同一命名空间下不同名称,实际上不可能碰撞。但不同命名空间里相同的名称会得到不同结果,这是刻意设计。
v5 能排序吗?
不能。哈希输出是均匀分布的,顺序没有意义。需要排序请用 v7。