一、什么是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 - 知乎

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

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

  1. 录的视频太长怎么剪切?试试这个剪辑技巧

    据说一开始玩抖音的人,都容易痴迷!这不,小北的一个朋友最近就中了抖音的魔,每天睡前都要刷个两三个小时,以前从不爱拍照拍视频的他最近也是什么都喜欢往抖音上分享了!这不,今天朋友拍了一个比较长的视频,觉得 ...

  2. 快来试试一行java程序看cpu核心数

    1.用一行java程序看cpu核心数 package netty.io;public class CountOfCpu {public static void main(String[] args) ...

  3. 比UUID更快更安全NanoID到底是怎么实现的?(荣耀典藏版)

    前言 UUID 是软件开发中最常用的通用标识符之一.然而,在过去的几年里,其他的竞品挑战了它的存在. 其中,NanoID 是 UUID 的主要竞争对手之一. 因此,在本文中,我们将展开讨论 NanoI ...

  4. CentOS 停止维护,2022年,快来试试这些最佳替代方案!Rocky Linux(每个版本长达十年的支持,强烈推荐)

    CentOS 停止维护,2022年,快来试试这些最佳替代方案! 总所周知,CentOS在国内的地位可以说是相当厉害,因为Centos是RHEL(红帽)的再编译版本,而且在RHEL的基础上修正了不少已知 ...

  5. 微信朋友圈+html+字体,一键修改微信朋友圈字体,快来试试吧

    原标题:一键修改微信朋友圈字体,快来试试吧 大家好,我们平时发朋友圈的字体是不是很单调呢,有很多小伙伴喜欢与众不同,最近小编发现有很多朋友发朋友圈的时候,用上了特别个性的艺术字体,今天小编就给大家准备 ...

  6. socket连接时间太长受什么原因影响?_真全粮多功能酿酒设备-酿酒发酵前期为什么要通风处理?...

    用做白酒的设备酿过酒的都知道,发酵会影响白酒的口感,对于酿酒新手来说,怎样管理发酵很关键.谈谈做白酒的设备酿酒时,发酵前期为什么要通风?酿酒师在酿酒时,会在发酵的前三天半密封做一次开放式循环,三天后做 ...

  7. 事态升级是什么意思_第602期搞笑gif动图:不好意思,腿太长了,来个歪打正着...

    1.被迫体验了滑雪的感觉. 2.不好意思,腿太长了,来个歪打正着! 3.不能平衡的平衡车买了有什么用! 4.差点就能靠翻车拿第二了! 5.车跑得太快了我也没想到! 6.导演麻烦把最后剪了吧! 7.翻船 ...

  8. jwt token 太长_理解 JWT 鉴权的应用场景及使用建议

    JWT 介绍 JSON Web Token(JWT)是一个开放式标准(RFC 7519),它定义了一种紧凑(Compact)且自包含(Self-contained)的方式,用于在各方之间以JSON对象 ...

  9. 太长的sql怎么分析_因为ESR, 我一定要推荐你这款 SQL 神器

    经常看我们号的读者,对SQL执行的理解,一定与别人不一样. 别人看到一条SQL,脑子里除了从上到下执行,就不会有别的想法.但是我们的读者肯定不是这样.比如以下这条简单的不能再简单的SQL,聚合求和: ...

最新文章

  1. RHEL5(CentOS)下nginx+php+mysql+tomcat+memchached配置全过程(转)
  2. python增加一列数据计算年龄_无法使用python中的条件计算年龄。得到一个价值
  3. BZOJ 1132 [POI2008]Tro(极角排序)
  4. 我的世界一进去就java_我的世界国际java版1.12.2加了光影修复进游戏就直接崩溃...
  5. Commit failed with error: pathspec 'src/main/java/com/leo/demo/juctest/test.java' did not match any
  6. 送给“苦逼”的IT人系列1:IT人的“钱”景以及收入的两道坎
  7. DecExpress 帮助网站
  8. codeforces 344A-C语言解题报告
  9. 揭秘丨7分钟看懂华为云鲲鹏Redis背后的自研技术
  10. 含隐变量模型求解——EM算法
  11. 番茄时间管理法(Pomodoro Technique):一个番茄是如何让你工作更有效率的
  12. 谷歌(chrome)浏览器扩展程序
  13. metasequoia :Summoner
  14. Android手机清除锁屏密码
  15. 安装Jdeveloper 12C
  16. 轻便简洁的电脑录音软件,免费收藏!
  17. 【C语言】案例二十九 综合案例——体育成绩管理系统
  18. 两种方法设置 .NET/C# 项目的编译顺序,而不影响项目之间的引用
  19. Android 11.0 系统Settings去掉开发者模式功能
  20. 设随机变量用计算机模拟,概率论实验报告1.docx

热门文章

  1. OpenCV4萌新之路——详解图像读取函数 “imread”
  2. git 克隆到指定分支
  3. React组件间信息传递方式
  4. Git如何上传文件到gitee?
  5. 常用的数字正则表达式(含小数)
  6. 跟艾文学编程《零基础入门学Python》(1)Python 基础入门
  7. BUUCTF:LSB
  8. Matlab/simulink采样仿真数据(时序)和时间序列的保存
  9. Vue.js结合Canvas制作二维码和图片的合成(qrcanvas + html2canvas)
  10. 算术表达式求值(C语言栈)