李锋镝的博客 - LiFengdi.Com

  • 首页
  • 时间轴
  • 留言
  • 左邻右舍
  • 我的日常
  • 关于我
青衿之志 履践致远
霁月光风 不萦于怀
  1. 首页
  2. 原创
  3. 正文

UUID太长怎么办?快来试试NanoId

2022年3月31日 4567点热度 0人点赞 2条评论

什么是NanoId

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

用法

可以引用下方的jar包,或者项目中直接自己创建工具类。

引用jar包的POM依赖如下:

        <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.");
        }
    }
}

工具类使用Demo

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            System.out.println(NanoIdUtils.randomNanoId());
            System.out.println(UUID.randomUUID());
        }
    }

输出:

tDT8gsr4aVwOvV10Pv6gX
1cc2ed01-4806-4698-96fb-2b2a1f255f9d
bzB0HMTxz18tWKTAMfyw_
33d63b00-b622-4302-a9ff-a1dd0033da42
6O7RE6YYNr1r_pn0ONhDR
53619651-fc19-4040-b0ab-b2f4a44c2641
bT9iJzMBsuXTJP2f559rE
7ffff372-fe0b-4dc9-8f96-76d3232ff3a9
FVHs5eoEPaPWWIgEqy0E1
90530a13-3ba3-4cf6-8a16-df66fc58ad53
aSmAG2am1dVZqVxDPXZ7C
c92aa977-e6df-4e8a-adc1-6edcf8ad8e23
oPKD5D76UNJabUYK-1mDS
ff087591-7011-49b8-8e3e-d9a3d62721db
0yZ9ej7rw0MGarryS_lZx
39abd8b9-72a8-4b66-8236-c3e83c3e1ba4
B6EgZgE0o49i2iPcFdR9J
08ff3204-b74b-448b-b1a5-041e31d503b9
GnouvvsCoYlEBw9IAZNLF
0da3b34a-87a7-4316-8f2a-5b4f6cf5a24f
除非注明,否则均为李锋镝的博客 - LiFengdi.Com原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.lifengdi.com/archives/article/3794
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: JAVA 高并发
最后更新:2022年3月31日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
guest
您的姓名(必填)
您的邮箱(必填)
您的站点
2 评论
最热
最新 最旧
Inline Feedbacks
查看所有评论
哥斯拉
哥斯拉
VIP
2022年4月1日 16:44

有win下的相关项目吗?生成稳定硬件码的。

0
0
回复
李锋镝
李锋镝
博主
回复  哥斯拉
2022年4月1日 20:53

@哥斯拉 没有 哈哈

0
0
回复
支付宝红包

佳节又重阳,玉枕纱厨,半夜凉初透。

最新 热点 随机
最新 热点 随机
回忆是一条没有尽头的路 这样的日子什么时候才是个头 MySQL 中的 distinct 和 group by 哪个效率更高? 开工啦~ 今晚,回家过年! 图数据库选型:Neo4j、Janus、HugeGraph
看病难~取药难~~阳了...开工啦~RocketMQ的push消费方式实现详解国庆节过的也很累~~MybatisCodeHelperPro激活
从零搭建Spring Cloud Gateway网关(三)——报文结构转换 Java设计模式-单例模式 成语接龙 Dapr 知多少 | 分布式应用运行时 分布式服务生成唯一不重复ID(24位字符串) HBASE填坑日志
最近评论
李锋镝 发布于 2 周前(03月10日) 已添加~欢迎回访喔
博客录(boke.lu) 发布于 2 周前(03月10日) 已添加贵站0.0 名称:博客录(boke.lu) 简介:boke.lu · 博客收录展示平台~ 链接...
李锋镝 发布于 3 周前(03月05日) 系统版本是win11吗?
HJQ 发布于 4 周前(02月28日) 同问,注册表都没有楼主说的值。
林羽凡 发布于 1 个月前(02月16日) 开工大吉。
有情链接
  • 志文工作室
  • 临窗旋墨
  • 旧时繁华
  • 城南旧事
  • 强仔博客
  • 林三随笔
  • 徐艺扬的博客
  • 云辰博客
  • 韩小韩博客
  • 知向前端
  • 阿誉的博客
  • 林羽凡
  • 情侣头像
  • 哥斯拉
  • 博客录

COPYRIGHT © 2022 lifengdi.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备16004681号-2