什么是UUID v8
UUID v8 是 RFC 9562 给出的一条逃生通道:除了必须写死的版本号(8)和变体号,剩下的 122 位可以由应用自行定义。
搜索引擎、时序数据库和分布式系统常把内部字段(分片号、序列号、自定义时间戳)打包进这 122 位,从而获得一个既能被外部当作标准 UUID 处理、又贴合自身需求的值。
使用方法
- 在下拉框里选择 v8。
- 设置数量,然后点击生成 UUID。
- 本工具生成的是随机填充的 v8,可作为标准兼容的占位符或测试值使用。
适用场景
- 把分片号、序列号等内部字段编码进 UUID。
- 在正式定义自有格式之前先做原型验证。
- 需要标准长度和格式、但内部语义自定的场景。
结构
前 48 位由应用自由使用,接着 4 位是版本号(8),然后是 12 位自由数据和2 位变体,最后 62 位同样自由。只有在 128 位格式和这两处标记上是固定的。
UUID v8 的定位
| 选项 | 何时使用 |
|---|---|
v8 | 122 位由应用自定义,RFC 只规定长度与两处标记 |
v4 | 开箱即用的随机标识符,不需要自定义布局 |
v7 | 需要时间排序时用它,不必自己实现排序逻辑 |
UUID 各版本速查表
| 版本 | 可排序 | 数据来源 | 适合的场景 |
|---|---|---|---|
| v1 | 不可以 | 时间戳 + MAC 地址 | 仍在依赖 v1 的既有系统 |
| v3 | 不可以 | 名称的 MD5 哈希 | 必须使用 MD5 时的确定性标识符 |
| v4 | 不可以 | 122 位随机数 | 绝大多数普通的唯一标识需求 |
| v5 | 不可以 | 名称的 SHA-1 哈希 | 需要同一名称始终得到同一标识符 |
| v6 | 可以 | 重排后的时间戳 | 既要随机性又要便于排序 |
| v7 | 可以 | 毫秒精度的 Unix 时间 | 数据库主键和事件标识符 |
| v8 | 不可以 | 自定义位布局 | 专有格式和实验性用途 |
这七个版本都是 128 位,都用同样的 8-4-4-4-12 写法表示,区别只在于各个位代表什么。
代码示例
javascript
// 写入 6 字节自定义时间戳,其余填随机数
const b = new Uint8Array(16);
crypto.getRandomValues(b);
const ts = BigInt(Date.now());
for (let i = 0; i < 6; i++)
b[i] = Number((ts >> BigInt((5 - i) * 8)) & 0xffn);
b[6] = (b[6] & 0x0f) | 0x80; // 版本 8
b[8] = (b[8] & 0x3f) | 0x80; // 变体
python
# Python 3.14+
import uuid
id = str(uuid.uuid8(bytes(8) + bytes(range(8))))
常见问题
v8 的这 122 位能随便用吗?
可以,但必须自己保证唯一性。RFC 只规定了 128 位长度和版本号、变体号的位置,其余部分完全由部署方决定。
v8 和「扩展 UUID」是一回事吗?
不是。扩展 UUID 曾被提议用于编码域标识,但从未成为标准;v8 是 RFC 9562 中正式定义的自定义版本。
什么时候该用 v8?
只有当你确实需要把内部字段塞进 UUID,或者要与某个已经采用 v8 的系统对接时。普通用途请选 v4 或 v7。