跳到正文
DevTools / UUID 与 ID 生成器

UUID 与 ID 生成器

选择标识符格式是架构决策而不是细节:它决定数据库索引是否会因每次插入而碎片化,决定 ID 是否泄露创建时间与数据规模,也决定它能否安全地出现在 URL 里。本生成器提供开发者真正需要权衡的几种格式——UUID v4、UUID v7、UUID v1、ULID、Nano ID、MongoDB ObjectId 与随机密码——支持批量生成,并给出每种格式的熵值以及按你所需数量计算的生日界碰撞概率。

完全在浏览器本地运行——不会上传任何内容。

122 random bits. The default when you just need a unique id.
熵
122bits
碰撞概率
~10^11
按生日界估算,假设取值均匀分布。
生成结果
8
结果
  1. 11b9c90a0-f735-459a-a491-46ea7bfb4771
  2. 2e8928f0c-a843-4ae7-bead-3aba37342f08
  3. 30fbb09a6-6217-4d0b-8a5c-d7149c705048
  4. 4f4e2e666-be66-4653-a670-b8acc240fa60
  5. 50922edd6-5588-4d00-91f1-8a3146ec4683
  6. 67ee36f3c-cd60-4684-8027-c46f92793db3
  7. 73c240211-ae8b-4500-9b30-bbcf1c1b6fd1
  8. 8cd2795cc-55b7-47ae-9d79-4ef9ee4eea27

范围校验

8 / 8 个取值落在范围内

工作原理

UUID v4 是 122 位随机数据,另有 6 位保留用于标记版本与变体,渲染为五组共 32 个十六进制数字。它的优势在于生成完全不需要协调:两台从未通信的机器各自生成,碰撞概率也可以忽略。代价是取值完全随机,插入 B 树索引时写操作会散布到整棵树,批量导入一百万行会触碰一百万个不同的页面,在大表上这是可测量的吞吐问题。

UUID v7 正是为解决这一点而生:它在最高位放入 48 位毫秒时间戳,其后是随机数据。由于取值随时间递增,它们会追加到索引末尾而不是散布其中,写性能接近顺序整数,同时保留足够随机性使其不可猜测。代价是时间戳对任何持有该标识符的人可见,从而暴露记录创建时间以及大致的数据量——有时有用,有时是泄露。

ULID 用不同编码表达了同样的思路:48 位毫秒时间戳加 80 位随机数,以 Crockford Base32 表示。该编码大小写不敏感,并去掉了容易混淆的字母 I、L、O、U。结果是 26 个字符、可按字典序排序、放进 URL 或文件名无需转义。Nano ID 走的是相反路线:使用紧凑的 URL 安全字母表,默认 21 个字符、约 126 位熵,追求的是“仍然不会碰撞的最短标识符”。

MongoDB ObjectId 看着另类,但遵循同样的趋势。它是 12 个字节:4 字节 Unix 秒级时间戳、5 字节进程随机值、3 字节计数器。它按创建时间可排序,比 UUID 短,并且是针对特定数据库的索引行为设计的。密码则从可配置的字符集中生成,并给出以比特表示的熵值,这才是真正重要的数字——长度本身是很差的替代指标,因为从 26 个字母中取 16 位字符的密码,其熵远低于从 94 个可打印 ASCII 字符中取 11 位。

常见应用场景

  • 为需要可排序、对索引友好的新表生成主键。
  • 在分布式系统中生成关联 ID,用于跨服务追踪一次请求。
  • 在没有任何中心计数器的情况下生成唯一的文件名或对象存储键。
  • 生成不泄露记录信息的会话令牌或邀请令牌。
  • 为需要大量真实标识符的测试夹具生成数据。
  • 生成带明确熵值的高强度随机密码或 API 密钥。

最后更新: 2026-10-14

常见问题解答

该选 UUID v4 还是 v7?

凡是要存进带索引的数据库,都选 v7,因为它的时间戳前缀让插入发生在索引末尾而不是散布其中,在大表上这可能就是写入路径健康与否的分界线。需要标识符不泄露时间信息、或者生成场景与数据库无关时用 v4。两者大小同为 128 位,碰撞概率同样可忽略。

真的不会碰撞吗?

对 UUID v4,生成十亿个标识符时的碰撞概率约为 2.7×10 的负 17 次方分之一,远小于生成期间硬件发生故障的概率。真正的隐患不在随机性,而在随机源:使用弱伪随机生成器,或在没有重新播种的情况下克隆的虚拟机,在实践中确实可能碰撞。这里生成的值使用浏览器的密码学安全生成器,其种子来自操作系统。

UUID 会泄露信息吗?

v7、v1 和 ULID 都会,因为它们把时间戳放在最高位。任何持有者都能读到毫秒级的记录创建时间,通过采样标识符还能估算出记录总量与增长速度。v4 是不透明的。如果标识符会公开暴露且创建速率的机密性重要,用 v4;如果是内部使用且索引性能重要,用 v7。

熵值是什么意思?

它是取值中不可预测性的比特数——即等概率可能性数量的以 2 为底的对数。UUID v4 有 122 位,意味着攻击者平均需要猜 2 的 121 次方次才能找到某一个特定值。熵同时决定抗碰撞能力和不可猜测性,也是比较不同格式时真正该看的数字,因为单看字符数会有误导:长度相同的两个标识符,因字母表不同,熵可能相差几十位。

相关工具