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、保留完整位、强制唯一,并把授权独立处理。