首选 crypto.randomUUID(),它直接生成符合 RFC 4122 v4 规范的 UUID 字符串;不支持时需手动用 getRandomValues() 或 randomBytes() 构造,并严格设置第6字节版本位和第8字节变体位。
直接用,只要环境支持且在安全上下文中 —— 这是目前最简、最安全、最标准的方式。
它底层调用 CSPRNG,自动生成符合 RFC 4122 v4 规范的 UUID 字符串,无需手动拼接、位运算或格式校验。不支持时才需降级处理。
crypto
.randomUUID() 的使用前提和常见报错
这个函数看似简单,但失败往往不是代码写错了,而是环境卡住了:
:浏览器版本太低(Chrome ≥92 / Firefox ≥95 / Safari ≥15.4),或运行在 IE、旧版 WebView 中
:当前是非安全上下文 —— 比如 HTTP 协议访问、非 localhost 的本地 IP(如
)、或某些 Electron/WebView 未启用安全策略
Node.js 中报错?确认版本 ≥14.17.0;v14–v18 可用,v19+ 仍可用(不依赖
),但
是独立 API,和 Web Crypto 实验标志无关
手动用 getRandomValues() 构建 v4 UUID 的关键步骤
当
不可用,又必须加密安全(不能用
),就得自己构造。核心不是“随机”,而是“合规”——UUID v4 要求第 13 位是
,第 17 位是
、
、
或
(即二进制
):
分配
,填入 16 字节随机值
设置版本号:
(保留低 4 位,高 4 位强制为
)
设置变体:
(保留低 6 位,高 2 位强制为
)
转字符串时严格按
分段,每段转小写十六进制,中间加连字符
别用
后 join —— 容易漏掉前导零,导致长度错误
Node.js 中不要硬套 Web Crypto 的 getRandomValues()
虽然 v19+ 支持
,但生产环境不推荐。更直接、稳定、高效的做法是:
用原生
替代
转换时用
,再手动插入连字符(位置:8, 13, 18, 23)
同样要修正字节:第 6 字节(索引 6)设为
,第 8 字节(索引 8)设为
避免用
在 Node.js 里生成后截断或重格式化 —— 它返回的就是标准字符串,直接用即可
真正容易被忽略的是:UUID 的“唯一性”不只靠随机,更靠规范实现。哪怕用了
,如果没正确设置版本位和变体位,生成的字符串就不是合法 v4 UUID,某些后端校验或数据库类型(如 PostgreSQL 的
类型)会拒绝入库。
crypto.randomUUID()crypto.randomUUID is not a functionTypeError: crypto.randomUUID is not available in this contexthttp://192.168.1.10--experimental-webcryptocrypto.randomUUID()crypto.randomUUID()Math.random()489ab10xxnew Uint8Array(16)array[6] = (array[6] & 0x0f) | 0x400100array[8] = (array[8] & 0x3f) | 0x80108-4-4-4-12.map(x => x.toString(16).padStart(2,'0'))--experimental-webcryptocrypto.randomBytes(16)getRandomValues(new Uint8Array(16))buf.toString('hex')(b & 0x0f) | 0x40(b & 0x3f) | 0x80crypto.randomUUID()getRandomValues()UUID