Java原生的UUID长度为36位,嫌长

这里自己实现了一套自己的算法,来生成较短的UUID

由雪花算法启发而来,

大致原理是利用时间戳+随机值做值,然后转换成62进制(当然这个进制数你也可以搞成更多)

有一些参数可以控制一些行为,都在注释里了

你可以自己修改digits数组,乱乱序啥的,混淆一下,随机性可能更好一些

/**
* Java 原生的UUID为36位 or 32位,太长. 这里提供一个位数较短的UUID.
* <p>
* UUID生成规则,当前时间减去'零时'的毫秒数 + N位随机数,转变成62进制的String类型.
* <p>
* 当前配置可满足30年内每毫秒10^9分之一的碰撞.
* <p>
* 实测现在长度为13位,想要更短的话可以调整下方的几个参数
*
* @author libing02 , on 11月 20, 2019.
*/
public class ShortUUID { /**
* digits还可以扩,但是不要包含下面的SEPARATOR
* <p>
* 也可以替换一个"乱序"digits排列,最终使uuid看起来不是有序的.
* <p>
* 一旦用到生产环境,digits就不要再变动了,否则会出现重复
* <p>
*/
private static final char[] digits = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.toCharArray(); private static final char SEPARATOR = '_'; // 2019-11-15 17:00:00
private static final long ERA_TIME = 1573808400000L; // UUID一次轮回的指数. 12则为大概30年左右,11则为3年左右. 13就是300年
private static final int TIME_LOOP_INDEX = 12; // 碰撞指数.毫秒下万万分之一
private static final int COLLISION_INDEX = 99999999; private static final boolean MIX_UP = true; public static String randomUUID() {
long passTime = System.currentTimeMillis() - ERA_TIME; long l = passTime;
// 反转主要是为了让uuid看起来不是递增的
// 但这也会导致出现极小概率不同时间的碰撞,所以建议优先选择不反转
if (MIX_UP) {
StringBuilder stringBuilder = new StringBuilder(String.valueOf(passTime)).reverse();
while (stringBuilder.length() < TIME_LOOP_INDEX) {
stringBuilder.append('0');
}
l = Long.parseLong(stringBuilder.substring(0, TIME_LOOP_INDEX));
} return baseConversion(l, digits.length) + SEPARATOR +
baseConversion(RandomUtils.ranInt(COLLISION_INDEX), digits.length);
} @Test
public void test() {
System.out.println(randomUUID());
} /**
* 将10进制转换成任意进制,照着Long原生的进制转换写的,原生最大支持到32进制
* <p>
* 这里支持到更高进制,可以扩展digits数组实现更高
*
* @param i 十进制Long型
* @param radix 进制,[2-62]
* @return 转换后的String
*/
public static String baseConversion(long i, int radix) {
if (radix < 2 || radix > digits.length) {
radix = 10;
} int charPos = digits.length * 2;
final int size = charPos + 1; char[] buf = new char[size];
boolean negative = (i < 0); if (!negative) {
i = -i;
} while (i <= -radix) {
buf[charPos--] = digits[(int) (-(i % radix))];
i = i / radix;
}
buf[charPos] = digits[(int) (-i)]; if (negative) {
buf[--charPos] = '-';
} return new String(buf, charPos, (size - charPos));
}
}

更短且不失高效的UUID生成算法的更多相关文章

  1. 一个UUID生成算法的C语言实现 --- WIN32版本 .

    一个UUID生成算法的C语言实现——WIN32版本   cheungmine 2007-9-16   根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...

  2. 一个UUID生成算法的C语言实现——WIN32版本

    源: 一个UUID生成算法的C语言实现——WIN32版本

  3. UUID 生成(源代码编译)

    根据定义,UUID(Universally Unique IDentifier,也称GUID)在时间和空间都是唯一的.为保证空间的唯一性,每个UUID使用了一个48位的值来记录,一般是计算机的网卡地址 ...

  4. 分布式全局不重复ID生成算法

    分布式全局不重复ID生成算法 算法全局id唯一id  在分布式系统中经常会使用到生成全局唯一不重复ID的情况.本篇博客介绍生成的一些方法. 常见的一些方式: 1.通过DB做全局自增操作 优点:简单.高 ...

  5. 分布式系统的唯一id生成算法你了解吗?

    在分库分表之后你必然要面对的一个问题,就是id咋生成? 因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那肯定不对啊. 举个例子,你的订单表拆分为了1024张订单表,每个表的id都从 ...

  6. ES批量索引写入时的ID自动生成算法

    对bulk request的处理流程: 1.遍历所有的request,对其做一些加工,主要包括:获取routing(如果mapping里有的话).指定的timestamp(如果没有带timestamp ...

  7. 使用深度学习检测DGA(域名生成算法)——LSTM的输入数据本质上还是词袋模型

    from:http://www.freebuf.com/articles/network/139697.html DGA(域名生成算法)是一种利用随机字符来生成C&C域名,从而逃避域名黑名单检 ...

  8. 美团技术分享:深度解密美团的分布式ID生成算法

    本文来自美团技术团队“照东”的分享,原题<Leaf——美团点评分布式ID生成系统>,收录时有勘误.修订并重新排版,感谢原作者的分享. 1.引言 鉴于IM系统中聊天消息ID生成算法和生成策略 ...

  9. 如何做系列(4)-微博URL短网址生成算法原理(java版、php版实现实例)

    短网址(Short URL),顾名思义就是在形式上比较短的网址.通常用的是asp或者php转向,在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代 ...

随机推荐

  1. Word 查找和替换字符串方法

    因为项目需要通过word模板替换字符串 ,来让用户下载word, 就在网上找了找word查找替换字符串的库或方法,基本上不是收费,就是无实现,或者方法局限性太大 .docx 是通过xml来存储文字和其 ...

  2. 用html自己开发自己的串口TCP通讯调试软件

    今天给大家介绍一个通讯工具,可以自己写html页面,自己写Js脚本实现数据收发. 本程序在不断完善中,请大家不要喷,多多理解,有意见只管提. 系列文章 概述 串口基础功能 TCP客户端收发 参数篇 串 ...

  3. 7.bug生命周期

    new:测试发现并提交bug,状态为new/active; open: 分配bug到开发人员,状态为open: fixed:开发人员处理完bug,将状态改为fixed: closed/reopen:测 ...

  4. SpringIOC框架简单实现(注解实现)

    SpringIOC框架简单实现(注解实现) 前情回顾 SpringIOE简单介绍 运用注解的方式来实现IOC 首先,让我们来创建一个Dog类 @Component("dog")// ...

  5. Windows远程时无法复制文件--杀进程rdpclip.exe,然后再启动

    1.远程登陆到主机上 2.任务管理器杀进程rdpclip.exe 3.[开始],搜索rdpclip.exe,点击运行 此时重新复制文件,可以跨主机复制啦 原以为是公司网络限制,现在看来还是没那么先进嘛

  6. hdu4845 状态压缩BFS

    题意:      给一个n*m的矩阵,从11,走到nm,格子和格子之间可能有墙,也可能有门,有的格子上面有钥匙,相应的钥匙开相应的们,捡钥匙和开门都不需要时间,问你最少多少部能走到nm. 思路:   ...

  7. 【前端】vue2.x 配合 bootstrapTable 动态添加元素和绑定点击事件,事件无效 解决

    背景: 使用bootstrap-table 表格插件时,每一行的最后一班会加操作按钮列.如果不加入vue的话,使用插件自己的列属性formatter:function(value, row, inde ...

  8. Mybatis学习之自定义持久层框架(七) 自定义持久层框架优化

    前言 接上文,这里只是出于强迫症,凭借着半年前的笔记来把之前没写完的文章写完,这里是最后一篇了. 前面自定义的持久层框架存在的问题 Dao层若使用实现类,会存在代码重复,整个操作的过程模版重复(加载配 ...

  9. 逆向工程初步160个crackme-------3

    这个Crackme3 涉及到浮点指令以及浮点数的存储与运算,我没学习过浮点指令,不得不从网上恶补了1个小时,一边看汇编指令一边百度其指令含义. 回头得好好补补这方面的知识了,太菜了! 我大致了解了一下 ...

  10. 『居善地』接口测试 — 5、使用Requests库发送POST请求

    目录 1.请求正文是application/x-www-form-urlencoded 2.请求正文是raw (1)json格式文本(application/json) (2)xml格式文本(text ...