原文地址:Why is NanoID Replacing UUID?

原文作者:Charuka Herath

译文出自:掘金翻译计划

本文永久链接:https://github.com/xitu/gold-miner/blob/master/article/2021/why-is-nanoid-replacing-uuid.md

译者:霜羽 Hoarfroster

UUID 是软件开发中最常用的通用标识符之一。然而,在过去的几年里,其他的竞品挑战了它的存在。

其中,NanoID 是 UUID 的主要竞争对手之一。

因此,在本文中,我们将展开讨论 NanoID 的功能、它的亮点以及它的局限性,以便让我们更好地了解何时使用它。


了解 NanoID 及其用法

对于 JavaScript,生成 UUID 或 NanoID 都非常简单。它们都有对应的 NPM 包来帮助我们实现生成。

我们所需要做的就是运行 npm i nanoid 命令安装 NanoID NPM 库 并在我们的项目中使用它:

import { nanoid } from 'nanoid';
model.id = nanoid();

“你是否知道 NanoID 每周的 NPM 下载量超过 1175.4 万,并且运行起来比 UUID 快 60%?”

此外,NanoID 比 UUID 年轻了将近 7 年,而且它的 GitHub 星数已经比 UUID 多。

下图显示了这两个之间的 npm 趋势比较,我们可以看到 NanoID 的上升趋势与 UUID 的平坦进展有强烈的对比。

https://www.npmtrends.com/nanoid-vs-uuid

我希望这些数字已经说服你去尝试 NanoID。但是,这两者之间的主要区别很简单。它归结为键使用的字母表。由于 NanoID 使用比 UUID 更大的字母表,因此较短的 ID 可以用于与较长的 UUID 相同的目的。

1. NanoID 只有 108 个字节那么大

与 UUID 不同,NanoID 的大小要小 4.5 倍,并且没有任何依赖关系。此外,大小限制已用于将大小从另外 35% 减小。

大小减少直接影响数据的大小。例如,使用 NanoID 的对象小而紧凑,能够用于数据传输和存储。随着应用程序的增长,这些数字变得明显起来。

2. 更安全

在大多数随机生成器中,它们使用不安全的 Math.random()。但是,NanoID 使用 crypto module 和 Web Crypto API,意味着 NanoID 更安全。

此外,NanoID 在 ID 生成器的实现过程中使用了自己的算法,称为 统一算法,而不是使用“随机 % 字母表” random % alphabet

3. 它既快速又紧凑

NanoID 比 UUID 快 60%。与 UUID 字母表中的 36 个字符不同,NanoID 只有 21 个字符。

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz-

此外,NanoID 支持 14 种不同的编程语言,它们分别是:

C#、C++、Clojure 和 ClojureScript、Crystal、Dart & Flutter、Deno、Go、Elixir、Haskell、Janet、Java、Nim、Perl、PHP、带字典的 Python、Ruby、Rust、Swift

4. 兼容性

它还支持 PouchDB、CouchDB WebWorkers、Rollup 以及 React 和 Reach-Native 等库。

我们可以使用 npx nanoid 在终端中获得唯一 ID。在 JavaScript 中使用 NanoID 唯一的要求是要先安装 NodeJS。

此外,我们还可以在 Redux toolkit 中找到 NanoID,并将其用于其他用例,如下所示;

import { nanoid } from ‘@reduxjs/toolkit’
console.log(nanoid()) //‘dgPXxUz_6fWIQBD8XmiSy’

5. 自定义字母

NanoID 的另一个现有功能是它允许开发人员使用自定义字母表。我们可以更改文字或 id 的大小,如下所示:

import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('ABCDEF1234567890', 12);
model.id = nanoid();

在上面的示例中,我将自定义字母表定义为 ABCDEF1234567890,并将 Id 的大小定义为 12。

6. 没有第三方依赖

由于 NanoID 不依赖任何第三方依赖,随着时间的推移,它能够变得更加稳定自治。

从长远来看,这有利于优化包的大小,并使其不太容易出现依赖项带来的问题。


局限性和未来重点

根据 StackOverflow 中的许多专家意见,使用 NanoID 没有明显的缺点或限制。

非人类可读是许多开发人员在 NanoID 中看到的主要缺点,因为它使调试变得更加困难。但是,与 UUID 相比,NanoID 更短且可读。

另外,如果你使用 NanoID 作为表的主键,如果你使用相同的列作为聚集索引也会出现问题。这是因为 NanoID 不是连续的。

在将来……

NanoID 正逐渐成为 JavaScript 最受欢迎的唯一 id 生成器,大多数开发人员更喜欢选择它而不是更喜欢 UUID。

来源:https://www.npmjs.com/package/nanoid

上述基准测试显示了 NanoID 与其他主要 id 生成器相比的性能。

“使用默认字母表每秒可生成超过 220 万个唯一 ID,使用自定义字母表每秒可生成超过 180 万个唯一 ID。”

根据我使用 UUID 和 NanoID 的经验,考虑到它的小尺寸、URL 友好性、安全性和速度,我建议在任何未来的项目中使用 NanoID 而不是 UUID。因此,我邀请您在下一个项目中试用 NanoID,并在评论部分与其他人分享您的想法。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

UUID 正在被 NanoID 取代?相关推荐

  1. UUID正在被NanoID取代?

    欢迎关注方志朋的博客,回复"666"获面试宝典 UUID 是软件开发中最常用的通用标识符之一.然而,在过去的几年里,其他的竞品挑战了它的存在. 其中,NanoID 是 UUID 的 ...

  2. 如何把一段简单的代码变复杂?

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:zhihu.com/question/277243683/answer/393676961 这问题你应该去问企业级Java架构 ...

  3. 一个接口同时支持 form 表单、form-data、json 的优雅写法

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:https://juejin.cn/post/7054441239839506446 最近重写个项目遇到个比较棘手的问题,老项 ...

  4. 4 种主流的 API 架构风格对比

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文讨论了四种主要的 API 架构风格,比较它们的优缺点,并重点介绍每种情况下最适合的 API 架构风格. 两个单独的应用程序需要中 ...

  5. 多账号统一登录(实现方案)

    欢迎关注方志朋的博客,回复"666"获面试宝典 现在几乎大部分的 App 都支持使用多个第三方账号进行登录,如:微信.QQ.微博等,我们把此称为多账号统一登陆.而这些账号的表设计, ...

  6. 使用 Jenkins 部署码云上的 Spring Boot 项目

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文介绍 jenkins 何从 gitee 上 clone 项目,然后使用 maven 打包并后台启动. 1.Jenkins 介绍 ...

  7. Spring Cloud Gateway CORS 方案看这篇就够了

    欢迎关注方志朋的博客,回复"666"获面试宝典 在 SpringCloud 项目中,前后端分离目前很常见,在调试时,会遇到两种情况的跨域: 前端页面通过不同域名或IP访问微服务的后 ...

  8. 在微服务架构下基于 Prometheus 构建一体化监控平台的最佳实践

    欢迎关注方志朋的博客,回复"666"获面试宝典 随着 Prometheus 逐渐成为云原生时代的可观测事实标准,那么今天为大家带来在微服务架构下基于 Prometheus 构建一体 ...

  9. 如何设计一个支撑数亿用户的系统

    欢迎关注方志朋的博客,回复"666"获面试宝典 要设计出一套能支撑几十亿人的系统是很困难的.对于软件架构师来说,这一直是一项很大的挑战,但是,从现在开始,看完我的文章,你就会觉得容 ...

最新文章

  1. Eclipse 调试器(引用IT168)
  2. 人人都能搞懂的AI(四)- AI对社会的影响
  3. leetcode剑指 Offer 53 - II. 0~n-1中缺失的数字(二分查找)
  4. Revealing图片展示效果(jQuery)
  5. 034. asp.netWeb用户控件之三通过用户控件实现用户注册和登录
  6. 43.Linux/Unix 系统编程手册(下) -- 进程间通信简介
  7. [Android Pro] 组件化:企业级大型项目必经之路
  8. for input string:是什么原因出现的_「汽车空调异味」周期性出现:原因是什么呢?...
  9. html从入门到精通(全)
  10. 2022年第十三届蓝桥杯省赛--难度评价
  11. hsqldb 的简单使用
  12. android x86 联网,没有网络连接 – VMWare Fusion上的Android-x86
  13. android:viewpager实现图片循环滑动+索引点击事件
  14. 下次约会时,让人工智能做你的僚机!
  15. 仙人掌之歌——路转峰回(3)
  16. 已解决:Win10无法访问Samba共享文件夹
  17. 在Java中获取两个数的中间值(超大数值)
  18. 细胞膜包覆的介孔铜/锰硅酸盐纳米球(mCMSNs)|黑磷量子点纳米囊泡(BPQD-CCNVs)
  19. 嵌套列表与列表推导式
  20. linux3.10.46源码下载,Ubuntu11.10下编译android源码4.0.3

热门文章

  1. MySQL入门之索引
  2. vue-element-xlsx在线读取Excel数据预览
  3. inline行内元素
  4. php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能
  5. js change事件 获取新值和旧值_前端总结(JS篇)
  6. bulk of the 用法_代词的用法详解:第三部分(不定代词)
  7. android使用perfetto工具步骤
  8. (数据分析三板斧)第一斧Numpy-第一节:Numpy基本了解
  9. Linux系统编程31:进程信号之什么是信号的阻塞及相关术语(递达,未决,pending位图,handler位图)
  10. pip 查看要安装的包所有版本(所有包版本)