UUID太长怎么办?快来试试NanoId(Java版本)

简介: UUID太长怎么办?快来试试NanoId(Java版本)

一、什么是NanoId

nanoid库和uuid库一样都可以生成唯一识别码 ,但是nanoid相比uuid要更轻量级。

二、怎么使用

引入jar包或使用工具类

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

工具类

import java.security.SecureRandom;
import java.util.Random;
 
public final class NanoIdUtils {
    public static final SecureRandom DEFAULT_NUMBER_GENERATOR = new SecureRandom();
    public static final char[] DEFAULT_ALPHABET = "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
    public static final int DEFAULT_SIZE = 21;
 
    private NanoIdUtils() {
    }
 
    public static String randomNanoId() {
        return randomNanoId(DEFAULT_NUMBER_GENERATOR, DEFAULT_ALPHABET, 21);
    }
 
    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.");
        }
    }
}

三、初体验

public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(NanoIdUtils.randomNanoId());
            System.out.println(UUID.randomUUID());
        }
    }
DHxVDk6OlUpJv4DMsJBQm
f6a4834d-494d-411f-98c6-aae886d104ec
OITlZuemCDn9CRR0ZruMB
0990b182-127a-44f7-9660-5bf9e8fb232f
GNNdtQaXVCRYgfxPbr1TF
8de0a3f9-5db1-43a9-806f-be95084586d2
BXpOVuLkOGdiu6bwxV34i
c9dbfdab-11a0-454c-b700-55f3556c5335
KB8kXivS0urYqnx_Hs1vp
36775a12-bed3-47f4-b9d9-eecb156079fa
nuTskLmIof63GExt9sduR
b448109f-bad9-473c-a1c5-f3a65f80a698
pJRdALwVBlrVMSuKwEX_z
e252312e-3806-4581-b3b4-842cccf83298
LuH50GGpZGqQz4ny2F7wT
01b846b0-753b-4fcf-97bd-c19bd2368570
qBndTEU1n2KBslPqORc67
a2f828cc-b5cf-4639-b2fe-e674ae0db4b5
vbNaVYd6rqUfbEWpcxrKM
321cc407-e72f-434f-89ce-06c6eec3ff88

四、相比优势

[译] 为什么 NanoID 会取代 UUID - 知乎

空间小、更安全、可以自动以子母表

相关文章
|
1月前
|
Java 中间件 测试技术
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
java依赖冲突解决问题之jar包版本冲突无法通过升降级解决时如何解决
|
1月前
|
Java 应用服务中间件 Windows
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
|
1天前
|
Java
|
23天前
|
Java API 开发工具
Java不同的版本
Java不同的版本Java不同的版本
33 4
|
23天前
|
Java API 开发工具
Java版本
Java版本
29 2
|
1月前
|
Java API Apache
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
|
1月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
1月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
1月前
|
Java 测试技术 Maven
java依赖冲突解决问题之多个版本的jar包中都没有找到缺失的方法如何解决
java依赖冲突解决问题之多个版本的jar包中都没有找到缺失的方法如何解决
|
1月前
|
Java 编译器 开发者
JDK8到JDK23版本升级的新特性问题之编写一个简单的module-info.java文件,如何实现
JDK8到JDK23版本升级的新特性问题之编写一个简单的module-info.java文件,如何实现