李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 读书观影
  • 系列
  • AI工具集
  • 论坛
  • 友圈
    • 友链
    • 朋友圈
    • 游客中心
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于本站
    • Now
    • 每日心情
    • 网站地图
    • 网站统计
    • 赞助
  • 星球穿梭
  • 🚇开往
静亦定 动亦定
惟坚韧者始能遂其志
  1. 首页
  2. 原创
  3. 正文

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

2022年3月31日 237 0 2
本文最后更新于 2022年3月31日,距今已 1681 天,其中的信息可能已经发生变化,请注意甄别。

什么是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
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
分享到

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

也可使用浏览器菜单中的「分享」功能

微信扫一扫分享

标签: JAVA 高并发
最后更新:2022年3月31日

岁月同一天 11 月 6 日

回望过去的今天,你在写什么

  • AI
    1 年前 2025年11月6日
    AI能写代码,却造不出软件:软件工程的核心竞争力从未改变

    “我用AI拼了个Demo,就差上线了,能帮我变成产品吗?” 最近越来越多非技术从业者带着这样的需求找上门——他们可能是律…

  • 代码人生
    1 年前 2025年11月6日
    西蒙学习法实战指南:6个月攻克新领域,从入门到能用的高效路径

    作为IT从业者,我们每天都面临新技术的冲击——今天是AI大模型,明天是云原生,后天是低代码开发。有限的时间与无限的学习需…

  • AI
    1 年前 2025年11月6日
    从Token到计费:大模型背后的文本编码逻辑与商业本质

    你是否有过这样的困惑?——给大模型发一段500字的中文需求,却被扣除了800多个Token;同样一篇文章,在GPT-4中…

  • 6 年前 2020年11月6日
    8条经验轻松上手IDEA插件开发

    IDEA作为我们(后端Java开发者)必不可少的IDE,以其智能的代码提示、多样的框架支持、简洁的开发界面等特性,被业界…

  • 其他
    7 年前 2019年11月6日
    架构师究竟比高级开发厉害在哪?

    目前我在互联网公司里干了1年多,接触了多位技术和业务的架构师,由于我正在升级到架构师,所以能直观地感受到高级开发和架构的…

  • 转载
    7 年前 2019年11月6日
    如何在面试中介绍自己的项目经验

    在面试时,经过寒暄后,一般面试官会让介绍项目经验 。常见的问法是,说下你最近的(或最拿得出手的)一个项目。 根据我们的面…

相关文章
  • Java中ArrayList为什么比LinkedList查询速度快?2020年5月16日
  • 6个高频设计模式深度解析(附完整案例与避坑指南)2025年10月16日
  • RocketMQ入门级教程2022年8月16日
  • SpringBoot整合MongoDB2022年9月2日
  • 从零搭建Spring Cloud Gateway网关(二)—— 打印请求响应日志2020年3月19日

李锋镝

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

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

  • 哥斯拉Lv 2友

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

    WindowsWindowsChrome 90.0.4430.212Chrome 90.0.4430.212韩国韩国-Gangwon-do-Chuncheon
    2022年4月1日
    00 回复
    • 李锋镝Lv 5

      @哥斯拉 没有 哈哈

      WindowsWindowsChrome 99.0.4844.51Chrome 99.0.4844.51中国中国-北京
      2022年4月1日
      00 回复
  • 人言落日是天涯,望极天涯不见家。已恨碧山相阻隔,碧山还被暮云遮。

    听点儿音乐吧 朋友~
    文章目录
    最新 热点 随机
    最新 热点 随机
    给服务器加了WAF 又一个逆天改命的人:小小徐 AI的生成能力等于生产力吗? NGINX严重漏洞(CVE-2026-15176、CVE-2026-93479、CVE-2026-97205) Kratos-plus v1.1.27更新说明 php2shell远程执行漏洞修复(CVE-2026-109618 和 CVE-2026-109619)
    给主题增加了游客中心功能心气没了,干什么都不得劲我觉得是时候公布我的导航网站了游本昌去世关于主题加载速度优化的一点儿小演进给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能
    分布式之数据库和缓存双写一致性方案解析 为什么同样是分布式架构的Kafka需要Leader而Redis不需要? 减肥四个月~ 全网最全Shiro认证与授权原理分析 CC知识共享协议各协议内容解释 使用itext和freemarker来根据Html模板生成PDF文件,加水印、印章
    最近评论
    Hary 发布于 20 小时前(11月05日) 前几天看博友发的宝塔防火墙不就是一坨吗,还是算了。这WAF是可以直接部署在网站同一台服务器么
    李锋镝 发布于 1 天前(11月05日) 感谢来访,祝越来越好~
    李锋镝 发布于 1 天前(11月05日) 应该就是请求太频繁了,我看看合并一下静态资源这些
    不凡 发布于 1 天前(11月05日) 我打开这篇文章时,看到评论列表中的操作系统图标、浏览器图标和国家图标这三个都挂了,楼下的头像也挂了,...
    李锋镝 发布于 1 天前(11月05日) 触发CC防护了 我把限制改大一些
    标签聚合
    JAVA MySQL 分布式 AI AI编程 Theme Spring 架构 数据库 多线程 K8s IDEA Redis ElasticSearch SpringBoot 日常 JVM WordPress SQL Claude
    友情链接
    • 瓦匠个人小站
    • lijie blog
    • 知向前端
    • Honesty
    • 刘永博客
    • 韩小韩博客
    • 懋和道人
    • 林羽凡
    • 志文工作室
    • 彬红茶日记
    • 韩情脉脉
    • 九仞之行
    • sssr7844的博客
    • 皮皮社
    • 搬砖日记
    • 哥斯拉
    • Serendipity
    • Mr.Sun的博客
    • 老张博客

    COPYRIGHT © 2016-2026 lifengdi.com. ALL RIGHTS RESERVED.

    lifengdi.com 十年之约虫洞

    Domain age badge for lifengdi.com

    Theme Kratos-plus By Dylan Li

    津ICP备2024022503号-3

    京公网安备11011502039375号