← 所有文章

如何生成 UUID(v4)——以及你究竟什么时候需要它

2026-06-12

一句话答案: UUID(也叫 GUID)是一个 128 位的标识符,无需任何中心协调就能全局唯一。最常见的版本是 v4——122 个随机位,所以两个独立生成的 UUID 发生碰撞实际上是不可能的。点开 UUID 生成器 拿一个,或者一次批量生成几百个,全在你的浏览器里完成。和这里的一切一样,它用浏览器的 crypto API 在本地运行,所以你生成的值不会被记录到任何地方。

生成 UUID

  1. 打开 UUID 生成器
  2. 拿一个 v4 UUID,或者设个数量一次生成很多个。
  3. 复制其中一个,或者把整个列表复制下来,用于给数据库填充种子数据或做测试夹具。

一个 v4 UUID 看起来像 f47ac10b-58cc-4372-a567-0e02b2c3d479——第三组里的那个 4 标记了版本。如果你更想待在命令行里:

  • macOS / Linux: uuidgen
  • Node 或浏览器 JS: crypto.randomUUID()

crypto.randomUUID() 内置于现代浏览器和 Node 16+,使用密码学强度的 RNG,是在应用代码内部的正确选择。浏览器工具适合的是你现在只想要一个值粘到某处的情况。

你究竟什么时候需要 UUID

合适的用途:

  1. 主键。 在插入前于客户端生成 ID,不必为了一个自增值往返数据库一趟。还让你能合并多个数据集而不发生键碰撞。
  2. 幂等键。 随 API 请求带上一个 UUID,这样重试就不会重复扣款或重复创建。
  3. 文件名和对象名。 当大量上传落到同一个 bucket 时避免碰撞。
  4. 跨日志和服务的关联/追踪 ID(Correlation/trace IDs)。

什么时候不该用它

这是人们栽跟头的地方。一个 v4 UUID 是 随机的,但它 不是秘密

  • 别把它当安全令牌、会话 ID 或密码重置令牌用。 它生成出来是为了唯一,而不是在安全意义上不可猜测,而且它经常泄露在 URL 和日志里。请改用专门设计的秘密——高熵字符串见 密码生成器,或者用一个长度足够的 CSPRNG 生成令牌。
  • 别把它当面向人的短码用。 没人想在电话里念 f47ac10b-…。短小友好的码请用专门的短 ID 方案。
  • 别指望对 UUID 做哈希就能让它变成秘密。 如果输入空间是可预测的,哈希生成器 救不了你——哈希一个可猜的值,得到的还是一个可猜的结果。

关于碰撞:有了 122 个随机位,你得每秒生成数十亿个 UUID、连续生成很多年,碰撞才会变得有那么一丁点可能。实际上,把 v4 当作唯一的,然后继续往下做就行。

常见问题

UUID v4 真的唯一吗? 实际上,是的。它有 122 个随机位(大约 5.3×10³⁶ 种可能)。你得生成一个天文数字的量,碰撞才有可能发生,所以 v4 在实践中被当作唯一的。

UUID 和 GUID 有什么区别? 没有有意义的区别——GUID 是微软对同一个东西的叫法。格式和 128 位的大小完全一致。

能把 UUID 当会话令牌或 API 秘密用吗? 不能。UUID 的设计目标是唯一,不是当秘密,而且它经常出现在日志和 URL 里。请改用一个长度足够的、专门的密码学令牌。

怎么在代码里生成 UUID? 在现代浏览器和 Node 里用 crypto.randomUUID(),或在 macOS/Linux 命令行用 uuidgen。两者都能给你一个标准的随机 v4 UUID。

— Milo 🐨