v4 还是 v7:看你要不要排序
v4 是纯随机,122 位随机数,适合当唯一标识 —— 它不泄露任何信息,也不保证任何顺序。
v7 把前 48 位换成毫秒时间戳,因此大体按生成时间递增。这一点对数据库很友好:主键若是随机值,每次插入都落在 B+ 树的随机位置,索引页会频繁分裂;v7 的写入基本集中在末尾,插入性能和缓存命中都更好。要对外暴露又不想暴露具体时间时,仍选 v4。
随机性来自哪里
优先使用浏览器提供的加密级随机源:crypto.randomUUID(),或 crypto.getRandomValues 取值后按规范置好版本号与变体位。两者都是 CSPRNG,不是 Math.random。
只有在极老的浏览器上才会退到 Math.random,此时页面会如实提示「不适合安全用途」,不会假装一切正常 —— 安全相关的降级必须让你看见。
能生成多少,会不会撞
一次可生成 1 到 1000 个,默认 5 个。结果用集合做过统计,若出现重复会明确告诉你重复了几个(理论上概率极低,属于「告诉你不会发生,而不是悄悄忽略」)。
量级感受:v4 有 122 位随机数,即使连续生成十亿个,发生任意一对碰撞的概率仍然极小,日常业务不需要为此做去重检查。
格式选项和大写的坑
可以切换大写、去掉连字符。去掉连字符后是 32 个十六进制字符,长度更短,但可读性和与标准工具的对兼容性都会差一点。
注意大小写不是「风格问题」:RFC 规定输出应为小写,且部分数据库或中间件在做字符串比较时区分大小写,同一个 UUID 的大小写形式可能被当成两条不同的记录。除非有明确理由,保持小写带连字符的默认形式。
nil UUID 是干什么用的
全零的 00000000-0000-0000-0000-000000000000 叫 nil UUID,语义是「空值」或「未设置」,数据库里常用它表示「还没有关联对象」。
它是一个有明确定义的特殊值,不是随机生成的,别把它当成正常的随机 ID 发到生产数据里。
本地生成,不联网
生成全程在浏览器里完成,没有网络请求,也不落任何存储。需要多少个就生成多少个,刷新页面即消失。
结果可以整段复制,也能下载成文本文件(文件名形如 uuid-4.txt)。批量造测试数据时,生成 1000 个再下载是最省事的做法。
常见问题
v4 和 v7 该选哪个?
当数据库主键、需要按时间排序或追求插入性能时选 v7;需要不暴露生成时间、或只当唯一标识时选 v4。
生成的 UUID 会重复吗?
v4 有 122 位随机数,连续生成十亿个发生碰撞的概率仍极小,日常无需去重检查。页面若检测到重复会明确提示。
一次能生成多少个?
1 到 1000 个,默认 5 个。需要更多请分批生成后下载合并。
大写形式能直接用吗?
能,但需谨慎。RFC 规定输出为小写,且部分系统字符串比较区分大小写,同一 UUID 的大小写可能被当成两条记录。无特殊理由请保持默认小写。