什么是UUID v4
UUID v4 是使用最广泛的版本。除了版本号和变体号占用的 6 位之外,剩下的 122 位全部来自加密随机源,不包含时间、硬件地址或任何其他可被推断的信息。
由于不含任何标识性信息,v4 不会泄露生成时间和机器身份。代价是它无法按生成顺序排序:要做数据库索引键,通常应该选 v7。
使用方法
- 选择 v4(本页已默认选中)。
- 按需要设置数量,最多 1000 条。
- 点击生成 UUID,或按 Ctrl + Enter。
- 用「全部复制」或下载按钮把结果取走。
适用场景
- 数据库主键和分布式系统中的唯一标识。
- 接口返回的资源 ID、请求追踪号和会话标识。
- 任何不需要排序、也不应泄露时间信息的地方。
结构
第 13 位十六进制数是版本号(4),第 17 位是变体号(8、9、a 或 b);其余 30 位十六进制数都是随机数。
UUID v4 的定位
| 选项 | 何时使用 |
|---|---|
v4 | 纯随机,也是默认选择 |
v7 | 写入带索引的列时更合适,值集中在索引末端 |
v1 | 会暴露生成时间与节点信息,仅用于遗留系统 |
UUID 各版本速查表
| 版本 | 可排序 | 数据来源 | 适合的场景 |
|---|---|---|---|
| v1 | 不可以 | 时间戳 + MAC 地址 | 仍在依赖 v1 的既有系统 |
| v3 | 不可以 | 名称的 MD5 哈希 | 必须使用 MD5 时的确定性标识符 |
| v4 | 不可以 | 122 位随机数 | 绝大多数普通的唯一标识需求 |
| v5 | 不可以 | 名称的 SHA-1 哈希 | 需要同一名称始终得到同一标识符 |
| v6 | 可以 | 重排后的时间戳 | 既要随机性又要便于排序 |
| v7 | 可以 | 毫秒精度的 Unix 时间 | 数据库主键和事件标识符 |
| v8 | 不可以 | 自定义位布局 | 专有格式和实验性用途 |
这七个版本都是 128 位,都用同样的 8-4-4-4-12 写法表示,区别只在于各个位代表什么。
代码示例
javascript
// 浏览器与 Node 18+
const id = crypto.randomUUID();
python
import uuid
id = str(uuid.uuid4())
java
String id = java.util.UUID.randomUUID().toString();
csharp
var id = Guid.NewGuid().ToString();
sql
-- PostgreSQL 13+
SELECT gen_random_uuid();
常见问题
v4 会重复吗?
122 位随机的组合数是 2122,约 5.3 × 1036。要让重复概率达到 50%,需要生成约 2.7 × 1018 个值,即使每秒生成十亿个也要几十亿年。
v4 安全吗?
安全,前提是随机源本身可信。本页使用浏览器的 Web Crypto API(crypto.getRandomValues),这正是 RFC 4122 对 v4 所要求的方式。
v4 能排序吗?
不能。v4 的位是随机分布的,按字典序排列并不对应生成时间。如果需要可排序的标识符,请使用 v7。