1,代码实现
<dependency>
<groupId>com.aventrix.jnanoid</groupId>
<artifactId>jnanoid</artifactId>
<version>2.0.0</version>
</dependency>
工具类
package com.example.demo.test1;
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.");
}
}
}
测试:
package com.example.demo.test1;
import java.util.UUID;
/**
* @author wangjin
* @title: Test1
* @projectName demo
* @description: TODO
* @date 2022/3/26 0026 16:31
*/
public class Test1 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(NanoIdUtils.randomNanoId());
System.out.println(UUID.randomUUID());
}
}
}
结果:
JxOPh3frXiufRgiVMaSxt
493e7d4b-4c38-45e5-885b-2d378f58ecbc
dKJIiuINjzLFGNbH64-UK
9d168842-15de-4982-9937-159f895e8c4e
2z72xeZ3yjv3n7Jn1KHPW
77ba93e2-c7d9-4c6f-9810-368da0eb0006
Iqlkp3W9ET4yMAS_LA6J8
ab747588-d82c-4743-92d8-95fb5c4de539
CysV7aF9iLZbO-b12PN06
1507e7f7-c574-4954-bd70-ea69c26c73ab
uPPlUvP1xittA-7IaAGuK
156b04e4-caa4-4392-80f8-aeccbf620b10
j8mZVZVI_hKBDZeXLZyUI
40515be7-f775-4fb5-bc00-17f8edc5c3c3
puQoNJp8irpBIJ7ACN89t
d01a6c7a-55bc-492f-97b8-f511b179610e
5cZEngygDhJFfRxxiTudj
c26b5d58-f628-4ed8-92dd-c5e96d08fe5c
Sfd-kLyV4as8edOkse6h2
eca373e0-a5e1-469c-8d55-71a1a0715bb4
由此可以看出NanoID相比 它的尺寸小、URL 友好性、安全性和速度都较uuid要更好
网友评论