UUID 随便生成一个不就行了,版本有什么区别?

4 个讲解板块 · 关联 2 款站内工具 · 内容最后核对 2026-10-09

v1 会泄露机器信息,v4 完全随机但索引不友好,v7 带时间戳、适合当数据库主键。

直接答案

最关键的差别是「随机性放在哪」。v1 把时间和设备信息编码进 ID,同一个机器生成的 ID 会在时间上聚集,还带一点可预测性;v4 用 122 位随机数,完全不携带任何信息,所以不可预测,代价是插入数据库时索引会随机散落,页分裂多;v7 把毫秒时间戳放在最前面,剩下的位随机,所以它天然按时间有序,插入集中在索引尾部,性能更接近自增主键。

第二个差别是碰撞概率的口径。v4 有 122 位随机,需要生成约 2.7 乘以十的十八次方个才有 50% 的概率出现一次碰撞,按每秒十亿个算要八十六年;v7 在同一毫秒内的随机位只有 74 位,要一千六百多亿个才会碰到 50% 概率。两个数字都远超实际用量。真实世界里出现的碰撞几乎都源于随机源损坏,比如克隆虚拟机快照、用了被固定种子的随机数,而不是格式本身。

生成唯一 ID 这件事,很多项目的做法是在库里随手调用一个函数,用完就不管了。等到数据量上去、索引变大、或者安全审计开始追问 ID 里是否含时间信息,才发现版本选错要改主键。

选版本其实只需要回答两个问题:这个 ID 会不会给外部看到,以及它要不要被当作数据库主键。

1三个常用版本横向比

同样的 128 位,不同的排布带来完全不同的性质。

版本内容构成按时间有序适合场景
v1时间戳加设备标识大致有序只用于对接遗留系统
v4122 位纯随机无序会话标识、请求标识、对外 ID
v7毫秒时间戳加 74 位随机有序数据库主键、需要按创建时间排序的记录
名称派生型命名空间加名称的哈希无序但可复现同样的输入要得到同样的 ID

看字符串第三段的第一个字符就能判断版本:是 1 就是 v1,是 4 就是 v4,是 7 就是 v7。第四段的第一个字符指示变体,常规实现一般是 8 到 b 这几个值。

2碰撞概率到底有多小

把两个版本放进同一个尺度比较,才知道该不该担心。

v4 的量级
取值空间约 5.3 乘以十的三十六次方,生日界算出需要约 2.7 乘以十的十八次方个才有 50% 碰撞概率。按每秒十亿个的生成速度,要连续跑八十多年。
v7 的量级
同毫秒内可用的随机位是 74 位,同一毫秒内需要一千六百多亿个才到 50% 概率。实际系统每毫秒生成不了这么多 ID。
真正的风险不在算法
批量克隆的虚拟机、被固定种子的随机数生成器、自己实现时把随机位写成了递增计数,这些才会造成真实碰撞。用标准库并且保证随机源可用,就不会有问题。

3当主键时最实际的差别

性能和隐私,是两个必须权衡的点。

关注点v4 作为主键v7 作为主键
索引写入位置随机分散,页分裂与碎片多集中在尾部,接近自增主键的表现
是否会泄露时间不会会暴露出毫秒级的创建时间
是否需要协调服务不需要,任意节点独立生成不需要
改动成本老系统已经用了就别轻易换新系统优先选它

既想保持索引友好又不想对客户端暴露创建时间,可以用双列方案:内部主键用 v7,对外接口只暴露另一个随机的 v4 或专用令牌。

4别把 UUID 当安全令牌

这是一个独立且常见的误区。

UUID 保证的是唯一
它不保证不可猜测。v1 和 v7 都带时间信息,观察到几个 ID 后可能收窄猜测范围。
会话与密钥要用专用随机
登录令牌、重置密码链接、API 密钥这类凭据,应该用密码学安全的随机数生成器单独生成足够长的字符串。
长度也要看场合
数据库里如果有原生的 128 位类型就存原始字节;存成带连字符的字符串会占用两倍空间。

相关疑问

新项目应该选 v4 还是 v7?

如果这个 ID 会当数据库主键、或者需要按创建时间排序,优先 v7,它对索引更友好;如果只是请求标识、会话标识,或者不想让外部从 ID 推出创建时间,选 v4。两者在唯一性上都没有实际风险。

UUID v4 真的不会重复吗?

不会重复到需要担心的程度。122 位随机数需要约 2.7 乘以十的十八次方个才有 50% 概率出现一次碰撞,正常业务量远远够不着。真实发生的碰撞基本都来自随机源故障,比如同一个虚拟机快照被批量克隆启动。

为什么数据库不喜欢随机的 UUID 主键?

因为索引是有序结构,随机值会让插入分散到索引各处,导致页分裂、缓存命中率下降、表体积膨胀。带时间前缀的版本把插入集中到索引尾部,能大幅缓解这个问题,这也是新版标准推荐它做数据库键的原因。

UUID 能当公开的访问链接吗?

能,但要清楚它暴露什么。随机版本不泄露任何信息,时间有序版本会暴露毫秒级的创建时间。如果链接本身需要防止被枚举,应该用专门的随机令牌,而不是依赖 UUID 的格式。

内容标识:本页内容由人工智能辅助生成,并经人工核对与编辑。详见 人工智能生成内容标识说明。
内容说明:本页针对具体使用问题作答,方法步骤与数值由本站自行整理与复算,事实性内容以对应官方规范与文档为准。内容最后核对日期:2026-10-09。若发现错误,欢迎通过页脚反馈入口告知。