生成UUID的方法 Crypto.randomUUID()

对于我这种比较懒的人,一直以来都是直接用 new Date().valueOf() 或者 Math.random() 配合一些规则来生成唯一ID,不配置规则的话,出现重复的概率还是比较高的。前几天看到群里有人说起了这个新的API(也不新了21年夏天发布的了)就大概看了一下。

各个主流浏览器也都支持了。不过呢,开始支持的版本都比较高🔗 “randomUUID” | Can I use
所以在一些不喜欢更新软件版本的用户里面就会抛出错误比如说 "crypto" is not defined 或者 crypto.randomUUID is not a function

这个API使用起来就很方便了,直接 crypto.randomUUID() 就可以了。

crypto.randomUUID()
// '40b3b1a6-dc1b-477a-bcb8-cadd550a7768'

从文档上面看到 crypto.randomUUID() 生成的 UUIDv4 版本的,所以在客户端浏览器普遍比较高的项目里面可以直接用了,比自己写规则或者引入 UUID 这个依赖更方便,生成速度也更快。

👀 一些问题

#1. crypto.randomUUID() 生成的 UUID 出现重复的概率?

碰撞机率: p(n) ≈ 1 - e-n2/2x

246UUID当中,出现重复的概率为 4x10-160.0000000004)。

所以使用 crypto.randomUUID() 不会有出现重复的情况,放心大胆用就行。
如果是使用 Math.random() 和一定规则创建的 UUID 可能同时创建多条 UUID 的时候会有问题了,特别是一些为了兼容低版本的场景下。

#2. 是否可以在生产环境使用这个API?

看情况,如果你的项目需要兼容低版本的客户端,那么就不能使用,还是需要使用 UUID 这个依赖项。
如果只是面向自动更新的现代浏览器用户群体,那么就可以直接使用。像我厂都是用的 ChromeEdge 所以未来我多半会在项目内应用起来。

  • 有一些情况下浏览器更新到最新版本了,开发时没有问题。但是部署到线上环境时就会提示 crypto.randomUUID is not a function。多半是由于项目没有开启HTTPS导致的。

#3. NodeJS 是否也有 crypto.randomUUID() 这个API?

有,从 14.17.0 开始就有 crypto.randomUUID() 这个方法了。

From version 14.17.0, a similar method is available as crypto.randomUUID().

相关阅读

Crypto.randomUUID() - Web API | MDN
“randomUUID” | Can I use… Support tables for HTML5, CSS3, etc
Crypto | Node.js v19.4.0 Documentation
Crypto | Node.js v14.21.2 Documentation

UUID vs Crypto.randomUUID vs NanoID | Medium