UUID 是一个 128 位的标识符,靠「取值空间足够大」而不是靠中央协调来保证不重复。这带来一个很实际的好处:客户端可以在完全离线、不询问数据库的情况下自己生成主键,多个服务同时写入也不会撞号。代价是它比自增整数长得多,也不携带任何顺序信息。
不同版本解决的是不同问题。v4 是纯随机,适合绝大多数场景;v7 把毫秒级时间戳放在高位,因此按字符串排序就等于按生成时间排序,这对数据库索引很关键;v1 也含时间,但把 MAC 地址写进了标识符,会泄露生成设备的信息。NanoID 不是 UUID,它用更短的字符集换取更短的字符串,适合出现在 URL 里。
生成使用浏览器的 `crypto.getRandomValues()`,也就是操作系统提供的密码学安全随机源,不是 `Math.random()`。这一点在标识符被当作难以猜测的凭据使用时很重要。