如何生成 UUID(v4)——以及你究竟什么时候需要它
2026-06-12
一句话答案: UUID(也叫 GUID)是一个 128 位的标识符,无需任何中心协调就能全局唯一。最常见的版本是 v4——122 个随机位,所以两个独立生成的 UUID 发生碰撞实际上是不可能的。点开 UUID 生成器 拿一个,或者一次批量生成几百个,全在你的浏览器里完成。和这里的一切一样,它用浏览器的 crypto API 在本地运行,所以你生成的值不会被记录到任何地方。
生成 UUID
- 打开 UUID 生成器。
- 拿一个 v4 UUID,或者设个数量一次生成很多个。
- 复制其中一个,或者把整个列表复制下来,用于给数据库填充种子数据或做测试夹具。
一个 v4 UUID 看起来像 f47ac10b-58cc-4372-a567-0e02b2c3d479——第三组里的那个 4 标记了版本。如果你更想待在命令行里:
- macOS / Linux:
uuidgen - Node 或浏览器 JS:
crypto.randomUUID()
crypto.randomUUID() 内置于现代浏览器和 Node 16+,使用密码学强度的 RNG,是在应用代码内部的正确选择。浏览器工具适合的是你现在只想要一个值粘到某处的情况。
你究竟什么时候需要 UUID
合适的用途:
- 主键。 在插入前于客户端生成 ID,不必为了一个自增值往返数据库一趟。还让你能合并多个数据集而不发生键碰撞。
- 幂等键。 随 API 请求带上一个 UUID,这样重试就不会重复扣款或重复创建。
- 文件名和对象名。 当大量上传落到同一个 bucket 时避免碰撞。
- 跨日志和服务的关联/追踪 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 🐨