悦省yueser.com

← 全部指南

UUID 生成指南:批量生成 v4 与正确用法

如果你只是要一批不重复的随机 ID,直接用 UUID v4 生成器复制走就行;真正需要读这篇的,是要决定「用哪种 ID、怎么存、能不能对外暴露」的时候。

打开工具:UUID 生成

什么时候真的需要 UUID

多个地方都要自己造 ID、事后又不用对账的时候,UUID 才划算:浏览器离线建草稿、手机在弱网下排队记录、两个服务往同一张表里插数据、一条请求在五个日志里要串起来、给合作方一个猜不出来的资源标识。这些场景的共同点是:没人愿意或没办法先去数据库取号。

反过来说,单库单表、写入量不大的后台,自增 bigint 更省空间、索引更快、排查问题时也更好读。订单号、快递单号这种要给人念的编号同样不该用 UUID——36 个字符没人能在电话里念对。

怎么生成、怎么存才不出错

v4 的格式是 8-4-4-4-12 共 32 个十六进制字符加 4 个连字符,第 13 位固定是 4(版本号),第 17 位是 8、9、a、b 之一(变体位)。这两处不对,基本可以判断不是标准 v4。

大小写只是书写差异,a 和 A 是同一个值,但存进数据库前必须统一。混用在大写敏感的排序规则下,同一个标识会变成两行永远对不上的数据。建议统一小写:Postgres 的 uuid 类型和多数库的默认输出都是小写。

局限:顺序随机,猜不到也不等于安全

v4 完全随机,插入位置也随机,索引页分裂多,写入量大的表会比追典型的自增主键慢,索引也更占空间。既要唯一又希望大致有序,可以看 UUIDv7(毫秒时间戳在前)或 ULID,两者都能按创建时间排序。

另一个常见误解是「猜不到=安全」。UUID 不会过期、不能撤销、也没有签发记录,所以不能当密码重置链接里的 token 或接口密钥。这类场景需要服务端签发、一次性、有有效期、能主动作废的随机值。

常见问题

UUID v4 真的不会重复吗?

v4 有 122 位随机位。工程上可以当作不会重复:即使每秒生成十亿个、连续跑很多年,碰撞概率也远低于硬件出错的概率。现实中出现的重复,几乎都是截断了字符串,或者自己用时间戳加计数器拼出来的。

UUID 能当密码、邀请码或接口密钥吗?

不能。UUID 没有有效期、不能撤销、也不记录签发过程,泄露了无法作废;36 个字符对用户也太长。这类场景要用服务端签发的一次性 token,带过期时间和使用次数限制。

UUID、自增 ID 和 ULID 怎么选?

单库、写入密集、需要人来读,用自增 bigint;多端各自离线生成、要全局唯一,用 UUID;既要唯一又希望主键大致有序、减少索引分裂,用 UUIDv7 或 ULID。没有一种 ID 同时满足所有需求。

相关工具:UUID 生成