换掉 UUID,更快更安全!

什么是NanoID?

   nanoid可以生成唯一识别码,uuid也可以,那为什么推荐nanoid呢?

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

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

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

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

  1. 更安全

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

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

  1. 它既快速又紧凑

    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
  1. 兼容性

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

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

  1. 自定义字母

    NanoID 的另一个现有功能是它允许开发人员使用自定义字母表。

  1. 没有第三方依赖

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

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

 

限性

非人类可读是许多开发人员在 NanoID 中看到的主要缺点,因为它使调试变得更加困难.

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

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

JavaScript版本

  • 第一种方式

  •   
    import { nanoid } from 'nanoid';
    model.id = nanoid();
  • 第二种方式

  •   
    import { nanoid } from @reduxjs/toolkit’  
    console.log(nanoid()) //‘dgPXxUz_6fWIQBD8XmiSy’
  • 第三种方式自定义字母

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

java版本

第一步引入jar或者maven坐标

  
<dependency>
<groupId>com.aventrix.jnanoid</groupId>
<artifactId>jnanoid</artifactId>
<version>2.0.0</version>
</dependency>

附maven仓库更多版本链接

第二步创建工具类

  /**
* describe:NanoId生成id工具类
* author:lpan
* date:2022/4/6 11:48
*/
public class NanoIdUtil {
   //随机数生成器
   public static final SecureRandom DEFAULT_NUMBER_GENERATOR = new SecureRandom();
   //自定义字母
   public static final char[] DEFAULT_ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
   //自定义生成位数
   public static final int DEFAULT_SIZE = 18;

   private NanoIdUtil() {}

   public static String randomNanoId() {
       return randomNanoId(DEFAULT_NUMBER_GENERATOR, DEFAULT_ALPHABET, DEFAULT_SIZE);
  }

   public static String randomNanoId(Random random, char[] alphabet, int size) {
       if (random == null) {
           throw new IllegalArgumentException("random cannot be null!");
      } else if (alphabet == null) {
           throw new IllegalArgumentException("alphabet cannot be null!");
      } else if (alphabet.length != 0 && alphabet.length < 256) {
           if (size <= 0) {
               throw new IllegalArgumentException("size must be greater than zero!");
          } else {
               int mask = (2 << (int)Math.floor(Math.log((double)(alphabet.length - 1)) / Math.log(2.0D))) - 1;
               int step = (int)Math.ceil(1.6D * (double)mask * (double)size / (double)alphabet.length);
               StringBuilder idBuilder = new StringBuilder();

               while(true) {
                   byte[] bytes = new byte[step];
                   random.nextBytes(bytes);

                   for(int i = 0; i < step; ++i) {
                       int alphabetIndex = bytes[i] & mask;
                       if (alphabetIndex < alphabet.length) {
                           idBuilder.append(alphabet[alphabetIndex]);
                           if (idBuilder.length() == size) {
                               return idBuilder.toString();
                          }
                      }
                  }
              }
          }
      } else {
           throw new IllegalArgumentException("alphabet must contain between 1 and 255 symbols!");
      }
  }
}

第三步演示的demo

  
public static void main(String[] args) {
       for (int i = 0; i < 10; i++) {
           System.out.println("NanoId::" + NanoIdUtil.randomNanoId());
      }
}

输出结果

  
NanoId::uVgirz6vZf74Ntl6ev
NanoId::IHO4N7rRcoKYAwJ84q
NanoId::NUlxb3Qc4ro23bESnv
NanoId::LGyutujU0xSBvjTvSN
NanoId::98U3TzcuUMkQB5C0DZ
NanoId::O77ITBulDUS5McHAJ6
NanoId::dwPBQge8pzFKbxh4zu
NanoId::d9tM6iyw6r8u55z9mA
NanoId::DxjsHTlgRCFQMBi15D
NanoId::4xEsnwDoeMOi321QGs

笔者: 沙漏倒装回忆1024

出处https://www.cnblogs.com/lpan1024/

版权所有,欢迎保留原文链接进行转载!

请点赞关注留言,如果有任何建议也可以留言,因为我会回复每一条评论,感谢阅读。

posted @ 2022-04-07 22:39  沙漏倒装回忆1024  阅读(201)  评论(0编辑  收藏  举报