toolgarden.xyz
EN
UUID v4crypto.getRandomValues碰撞概率

UUID v4 是怎么生成的?为什么几乎不会重复?

理解 UUID v4 位布局、浏览器 Crypto、生日碰撞计算、不安全随机数和数据库约束。

ToolGarden 推荐的工具优先在浏览器本地运行,文件和文本不必上传到服务器,适合更注重安全隐私的日常处理。

发布于 2026年9月20日约 9 分钟阅读作者 ToolGarden

UUID v4 包含固定版本与变体位,以及 122 个随机位。只要随机源足够强,巨大空间会让碰撞概率极低。

“几乎唯一”是概率,不是证明。正确随机、保留全部位、数据库约束和系统规模,比复制一个 UUID 形状的代码片段更重要。

128-bit 布局

UUID 是按 8-4-4-4-12 分组的 32 个十六进制数字。v4 固定四个版本位为 0100,变体高位为 10,剩余 122 bit 随机。

连字符和大小写不会改变熵。

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
4 = version 4;y 高位是变体位 10

安全浏览器生成

crypto.randomUUID() 直接返回 v4;Fallback 用 crypto.getRandomValues 填充 16 字节,再设置版本与变体位。

Math.random 不是安全随机源,状态可能小得多,不适合依赖低碰撞或不可预测性的 ID。

const b = crypto.getRandomValues(new Uint8Array(16));
b[6] = (b[6] & 0x0f) | 0x40;
b[8] = (b[8] & 0x3f) | 0x80;

122 bit 有多大

空间包含 2^122 个值,约 5.3 × 10^36。与某个指定 UUID 相同约为这个数字的倒数。

生成 n 个值时,小概率生日近似为 p ≈ n(n−1)/(2 × 2^122)。理想条件下 10 亿个 UUID 仍只有约 9.4 × 10^-20。

真实故障比随机碰撞更重要

错误 RNG 播种、确定性测试 Mock、机器状态克隆、实现 bug 与截断,远比理想随机碰撞常见。

截短 UUID 前必须重新计算新空间与规模风险。

数据库仍需唯一约束

建立唯一索引并在极少冲突时重试,也能阻止重复导入与意外复用。

随机 ID 不是授权。它可能难枚举,但访问控制必须独立。

v4 与 v7

v4 随机且无自然顺序;v7 用 Unix 毫秒高位加随机数,通常改善数据库排序局部性。

应按排序、索引、信息暴露和生态支持选择。

总结

UUID v4 可靠是因为 122 个高质量随机位形成巨大空间,不是因为绝不碰撞。使用浏览器 Crypto、保留完整位、强制唯一,并把授权独立处理。

常见问题

Q.UUID v4 会碰撞吗?

理论上会,正确完整生成在普通规模下概率极低。

Q.Math.random 足够吗?

不够,应使用 crypto.randomUUID 或 crypto.getRandomValues。

Q.需要唯一索引吗?

需要,用于防范极小碰撞和常见软件错误。