【Java 开发实例】NanoID 唯一ID生成规则

785 阅读2分钟

一、简介

一个小巧、安全、URL友好、唯一的 JavaScript 字符串ID生成器。

“一个惊人的无意义的完美主义水平, 这简直让人无法不敬佩。”

  • 小巧.  130 bytes (已压缩和 gzipped)。 没有依赖。 Size Limit 控制大小。
  • 快速.  它比 UUID 快 60%。
  • 安全.  它使用加密的强随机 API。可在集群中使用。
  • 紧凑.  它使用比 UUID(A-Za-z0-9_-)更大的字母表。 因此,ID 大小从36个符号减少到21个符号。
  • 易用.  Nano ID 已被移植到 20种编程语言
import { nanoid } from 'nanoid'
model.id = nanoid() //=> "V1StGXR8_Z5jdHi6B-myT"

支持现代浏览器、IE 使用 Babel、Node.js 和 React Native。

来源: github.com/ai/nanoid/b…

二、Java 中的 NanoId

(1)概述
  • Java的唯一字符串ID生成器。
  • 安全:NanoID使用Java的SecureRandom生成具有适当字符分布的加密强随机id。
  • 简短:JNanoID生成只有21个字符的紧凑id。通过使用比UUID更大的字母,JNanoID可以生成更多的唯一id,与UUID相比,使用更少的字符(21对36)。
  • URL友好:JNanoID使用url友好的字符(A-Za-z0-9_-)。完美的唯一标识符在web应用程序。
  • 可定制化:JNanoID是完全可定制的。所有默认选项都可能被重写。提供你自己的随机数生成器,字母,或大小。
  • 可测试:使用JUnit对JNanoID进行了全面测试。
(2)引入依赖
① Maven 引入
<dependency>
    <groupId>com.aventrix.jnanoid</groupId>
    <artifactId>jnanoid</artifactId>
    <version>2.0.0</version>
</dependency>

② Gradle 引入

compile 'com.aventrix.jnanoid:jnanoid:2.0.0'
(3)用法示例

JNanoId提供了一个易于使用的实用程序类(NanoIdUtils),其中包含两个生成id的方法。

① 标准id - randomNanoId()
  • 默认方法创建安全的、url友好的、唯一的id。
  • 它使用一个url友好的字母(a- za -z0-9_-),一个安全的随机数生成器,并生成一个具有21个字符的唯一ID。
② 自定义id - NanoIdUtils.randomNanoId(随机、字母、大小);

另一种方法:允许您通过指定自己的随机数生成器、字母或大小来生成自定义id。

public static void main(String[] args) {

    // Use a faster, but non-secure, random generator
    Random random = new Random();

    // Use a custom alphabet containing only a, b, and c
    char[] alphabet = {'a', 'b', 'c'};

    // Make IDs 10 characters long
    int size = 10;

    String id = NanoIdUtils.randomNanoId(random, alphabet, 10); 
    System.out.println("nanoid: " + id);// aacaaaabca
}

三、扩展

(1)其他语言的 NanoId

另外,还有一个CLI工具可以从命令行生成id。

(2)nanoid-cli

一个围绕nanoid的小型cli包装器,用于从命令行生成惟一的id。

# 默认用法
$ nanoid
eftOYF0ie93F_yVhkOBcM

# 参数选项
--alphabet, -a  Use a different alphabet to generate the id
--size, -s      Generate an id of a different size

# 示例1:默认生成规则(长度为ID)
$ nanoid
sBiU98ZmAHvICIOnUoxOW
# 示例2:限定生成ID的长度
$ nanoid --size 32
xgX77wBFcY1lso9R12Y2lHrluUbLjAPV
# 示例3:限定字符范围集中生成随机ID
$ nanoid --alphabet "_~0123456789abcdefghijklmnopqrstuvwxyz"
6me9uz2j_blasac~0p5as

附录