UUID是软件开发中最常用的通用唯一识别码。然而,在过去几年中,其他替代方案对其提出了挑战。其中,NanoID是UUID的主要竞争对手之一。因此,在本文中,将讨论NanoID的特点、它的亮点以及它的局限性,以便更好地理解他和使用它。
了解NanoID及其用法
JavaScript中,生成UUID或NanoID都非常简单。都有NPM软件包。我们只需使用NPM i NanoID命令安装NanoID NPM库,就能项目中使用它。
代码语言:javascript复制import { nanoid } from 'nanoid';
model.id = nanoid();
NanoID每周NPM下载量超过11754K,而且速度比UUID快60%, 此外,NanoID比UUID年轻近7岁,但是它的GitHub star已经比UUID多。下图显示了这两个项目之间的npm趋势比较,我们可以看到与UUID的平稳进展相比,NanoID的上升趋势。
image.png
1.NanoID的大小只有108字节
与UUID不同,NanoID的大小比UUID小4.5倍,并且没有任何依赖性。这直接影响数据的大小。例如,使用NanoID的对象对于数据传输和存储来说既小又紧凑。随着程序的增长,这些特点将变得显而易见。
2.更安全
在大多数随机生成器中,它们使用不安全的Math.random()
。但是,NanoID使用更安全的crypto module
和 Web Crypto API
。此外,NanoID在ID生成器的实现过程中使用了自己的算法,称为uniform algorithm,而不是使用random % alphabet
.
3.速度快,结构紧凑
NanoID比UUID快60%。在UUID的字母表里有36个字符,而NanoID只有21个字符。
代码语言:javascript复制0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz-
此外,NanoID支持14种不同的编程语言,
代码语言:javascript复制C#, C , Clojure and ClojureScript, Crystal, Dart & Flutter, Deno, Go, Elixir, Haskell, Janet, Java, Nim, Perl, PHP, Python with dictionaries, Ruby , Rust, Swift
4.兼容性
它还支持PockDB、CouchDB WebWorkers、Rollup以及React和Reach Native等库。我们可以使用npx nanoid在终端中获得唯一的ID。唯一的先决条件是安装NodeJS。(其他语言也能,此处只从nodejs角度考虑)
image.png
此外,您还可以在Redux工具箱中找到NanoID,如下所示:;
代码语言:javascript复制import { nanoid } from ‘@reduxjs/toolkit’
console.log(nanoid()) //‘dgPXxUz_6fWIQBD8XmiSy’
5.自定义字母表
NanoID的另一个特性是,它允许开发人员自定义字母表以及生成的id的长度.
代码语言:javascript复制import { customAlphabet } from 'nanoid';
const nanoid = customAlphabet('ABCDEF1234567890', 12);
model.id = nanoid();
在上面的例子中,我将自定义字母表定义为ABCDEF1234567890,Id的长度为12。
6.无第三方依赖关系
由于NanoID不依赖于任何第三方依赖关系,随着时间的推移,它变得更加稳定、自治。从长远来看,这有助于优化捆绑包的大小,并使其不太容易出现依赖关系带来的问题。
局限性和未来焦点
局限性
基于StackOverflow方面的许多专家意见,使用NanoID没有明显的缺点或局限性。许多开发人员在NanoID中看到的主要缺点是不可读,因为它使调试更加困难。然而,与UUID相比起来,NanoID却要短得多,可读性强得多。此外,如果使用NanoID作为表的主键,那么如果使用同一列作为聚集索引,就会出现问题。这是因为NanoIDs不是连续的。
未来…
NanoID正逐渐成为JavaScript最流行的唯一id生成器,大多数开发人员更喜欢选择它而不是UUID。
image.png
上图显示了NanoID与其他主要id生成器的性能比较。使用默认字母表时,它每秒可以生成超过220万个唯一ID,使用自定义字母表时每秒可以生成超过180万个唯一ID。考虑到NanoID的小尺寸、URL友好性、安全性和速度,建议在未来的项目中使用NanoID而不是UUID。
译自:https://blog.bitsrc.io/why-is-nanoid-replacing-uuid-1b5100e62ed2