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

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

image.png

本篇译自:medium.com/@abdelmatyn…


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


image.png


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 下载趋势:

image.png


测速



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

// test-uuid-gen.js
const { v4 as uuidv4 } = require('uuid');
for (let i = 0; i < 10_000_000; i++) {
  uuidv4();
}
// test-crypto-gen.js
const { randomUUID } = require('crypto');
for (let i = 0; i < 10_000_000; i++) {
  randomUUID();
}
// test-nanoid-gen.js
const { 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 倍左右~


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

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


相关文章
|
前端开发 网络协议 Dubbo
超详细Netty入门,看这篇就够了!
本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。
91249 32
超详细Netty入门,看这篇就够了!
TortoiseSVN不支持中文路径
TortoiseSVN不支持中文路径
268 0
|
小程序
uni-app语音转文字功能demo(小程序同声翻译开箱即用)
uni-app语音转文字功能demo(小程序同声翻译开箱即用)
2025 0
uni-app语音转文字功能demo(小程序同声翻译开箱即用)
|
编译器 C++
VS /PROFILE(性能工具探查器)的使用
VS /PROFILE(性能工具探查器)的使用
253 0
|
安全 Linux 网络安全
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
【工具使用】几款优秀的SSH连接客户端软件工具推荐FinalShell、Xshell、MobaXterm、OpenSSH、PUTTY、Terminus、mRemoteNG、Terminals等
116701 0
|
机器学习/深度学习 人工智能 自然语言处理
Transformer介绍
Transformer模型于2017年由Google提出,其在BERT中大放异彩,革新了NLP领域。Transformer的优势在于并行计算能力和处理长距离依赖,通过自注意力机制避免了RNN/LSTM的梯度问题。它由编码器和解码器组成,使用位置编码处理序列信息。Transformer在机器翻译、文本生成、问答系统等多个任务中提升效率和准确性,并扩展至计算机视觉和语音识别。随着AI发展,Transformer成为大模型核心技术,推动整个产业进步。
|
数据采集 存储
4个步骤:如何使用 SwiftSoup 和爬虫代理获取网站视频
本文介绍了如何使用SwiftSoup库和爬虫代理技术抓取网站视频资源。通过安装SwiftSoup、获取HTML内容、解析HTML以提取视频链接,以及设置爬虫代理来绕过访问限制,可以实现高效、灵活的视频资源获取。示例代码展示了一个完整的过程,包括下载并存储视频文件到设备。结合这两种技术,可以有效应对网站访问挑战,方便地获取互联网视频资源。
472 3
4个步骤:如何使用 SwiftSoup 和爬虫代理获取网站视频
|
机器学习/深度学习 算法 机器人
论文介绍:使用仿真和领域适应提高深度机器人抓取效率
【5月更文挑战第11天】研究人员提出结合仿真数据和领域适应技术提升深度机器人抓取效率。通过在仿真环境中生成多样化抓取数据并使用GraspGAN和DANN进行像素级和特征级适应,使模型能在现实世界中更好地泛化。实验表明,这种方法能减少现实数据需求,同时保持高抓取性能。尽管面临物理差异和成功率挑战,该研究为机器人抓取技术的进步提供了新途径。论文链接:https://arxiv.org/abs/1709.07857
199 5
|
算法 图形学 C++
[EasyX库安装介绍讲解】超详细入门级
[EasyX库安装介绍讲解】超详细入门级
695 1
|
前端开发
CSS改变图标颜色(filter一行代码解决hover变换颜色问题)
CSS改变图标颜色(filter一行代码解决hover变换颜色问题)
503 0

热门文章

最新文章