写点什么

生成 UUID 的三种方式及测速对比!

作者:掘金安东尼
  • 2022 年 9 月 12 日
    广东
  • 本文字数:1369 字

    阅读完需:约 4 分钟

生成 UUID 的三种方式及测速对比!

通用唯一识别码(英语:Universally Unique Identifier,缩写:UUID)是用于计算机体系中以识别信息的一个 128 位标识符,通常表现为一串 32 位十六进制数字。



UUID 用于解决 ID 唯一的问题!


然而,如何确保唯一,这本身就是一项挑战!


如何保证所生成 ID 只有一个副本?如何保证两个 ID 之间没有相关性?唯一性和随机性之间怎么取舍......


(OS:看过本瓜之前写的《理解 P/NP 问题时,我产生了一种已经触碰到人类认知天花板的错觉?!》这篇文章的朋友,应该知道:或许这个世界上没有随机这个东西?任何随机都能被量子计算算清楚,上帝到底掷骰子吗?没人知道......)


是否有真正的随机,先按下不表,


基于目前的算力精度,现在各种 UUID 生成器和不同版本的处理方式能最大限度的确保 ID 不重复,重复 UUID 码概率接近零,可以忽略不计。


本篇带来 3 种 UUID 生成器! 👍👍👍

UUID

基于 RFC4122 标准创建的 UUID,它有很多版本:v1,v2..v5;


uuid v1是使用主机 MAC 地址和当前日期和时间的组合生成的,这种方式意味着 uuid 是匿名的。


uuid v4 是随机生成的,没有内在逻辑,组合方式非常多(2¹²⁸),除非每秒生成数以万亿计的 ID,否则几乎不可能产生重复,如果你的应用程序是关键型任务,仍然应该添加唯一性约束,以避免 v4 冲突。


uuid v5与 v1 v4 不同,它通过提供两条输入信息(输入字符串和命名空间)生成的,这两条信息被转换为 uuid;


特性:


  • 完善;

  • 跨平台;

  • 安全:加密、强随机性;

  • 体积小:零依赖,占用空间小;

  • 良好的开源库支持:uuid command line


上手:


import { v4 as uuidv4 } from 'uuid';
let uuid = uuidv4();
console.log(uuid) // ⇨ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'
复制代码

Crypto.randomUUID

Node.js API Crypto 提供 **randomUUID()** 方法,基于 RFC 4122 V4 生成随机数;


上手:


let uuid = crypto.randomUUID();
console.log(uuid); // ⇨ "36b8f84d-df4e-4d49-b662-bcde71a8764f"
复制代码

Nano ID

Nano ID 有 3 个 api:


  1. normal (blocking); 普通

  2. asynchronous;异步

  3. non-secure;非安全


默认情况下,Nano ID 使用符号(A-Za-z0-9-),并返回一个包含 21 个字符的 ID(具有类似于 UUID v4 的重复概率)。


特性:


  • 体积小:130 bytes (压缩后);

  • 零依赖;

  • 生成更快;

  • 安全:

  • 更短,只要 21 位;

  • 方便移植,支持 20 种编程语言.


上手:


import { nanoid } from 'nanoid'
let uuid = nanoid();
console.log(uuid) // ⇨ "V1StGXR8_Z5jdHi6B-myT"
复制代码


Nano IDnpm 下载趋势:


测速

我们不妨来对比以上所提 3 种生成 UUID 的方式速度差异:


// test-uuid-gen.jsconst { v4 as uuidv4 } = require('uuid');
for (let i = 0; i < 10_000_000; i++) { uuidv4();}
// test-crypto-gen.jsconst { randomUUID } = require('crypto');
for (let i = 0; i < 10_000_000; i++) { randomUUID();}
// test-nanoid-gen.jsconst { nanoid } = require('nanoid');
for (let i = 0; i < 10_000_000; i++) { nanoid();}
复制代码


借助 hyperfine


调用测试:hyperfine ‘node test-uuid-gen.js’ ‘node test-crypto-gen.js’ ‘node test-nanoid-gen.js’


运行结果:



我们可以看到, 第二种 randomUUID() 比第三种 nanoid 快 4 倍左右,比第一种 uuid 快 12 倍左右~


<hr>


OK,以上就是本篇分享~ 撰文不易,点赞鼓励👍👍👍


我是掘金安东尼,公众号同名,日拱一卒、日掘一金,再会~

发布于: 刚刚阅读数: 3
用户头像

安东尼陪你度过漫长编程岁月~ 2022.07.14 加入

社会我瓜哥,人狠话不多😎 微信 anthony1453,加我交个朋友😎 正联合【机械工业出版社】出版《程序员成长手册》,敬请期待😎 真正的大师,永远怀着一颗学徒的心(易)😎

评论

发布
暂无评论
生成 UUID 的三种方式及测速对比!_前端_掘金安东尼_InfoQ写作社区