对于我这种比较懒的人,一直以来都是直接用 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()
生成的 UUID
是 v4
版本的,所以在客户端浏览器普遍比较高的项目里面可以直接用了,比自己写规则或者引入 UUID 这个依赖更方便,生成速度也更快。
👀 一些问题
#1. crypto.randomUUID()
生成的 UUID
出现重复的概率?
碰撞机率: p(n) ≈ 1 - e-n2/2x
246 个UUID
当中,出现重复的概率为 4x10-16 (0.0000000004
)。
所以使用 crypto.randomUUID()
不会有出现重复的情况,放心大胆用就行。
如果是使用 Math.random()
和一定规则创建的 UUID
可能同时创建多条 UUID
的时候会有问题了,特别是一些为了兼容低版本的场景下。
#2. 是否可以在生产环境使用这个API?
看情况,如果你的项目需要兼容低版本的客户端,那么就不能使用,还是需要使用 UUID 这个依赖项。
如果只是面向自动更新的现代浏览器用户群体,那么就可以直接使用。像我厂都是用的 Chrome
和 Edge
所以未来我多半会在项目内应用起来。
- 有一些情况下浏览器更新到最新版本了,开发时没有问题。但是部署到线上环境时就会提示
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