Java16位订单号,Java通过UUID生成16位唯一订单号
小编在工作中遇到了标题中的场景,先查了一些微博,参考下大佬经验。最终发现大家写的都是一套代码,没有太多的信息量做对比,并且UUID的hashcode值重复的概率有多大问题,没有人给解释。小编根据自己经验,结合业务实际,对16编码总结了下,希望对你会有帮助。
网络上的写法:
public static void get16UUID(){
// 1.最大支持1-9个集群机器部署
int machineId = 1;
// 2.生成uuid的hashCode值
int hashCodeV = UUID.randomUUID().toString().hashCode();
// 3.有可能是负数
if(hashCodeV < 0) {
hashCodeV = - hashCodeV;
}
// 4.结果
String value = machineId + String.format("%015d", hashCodeV);
System.out.println(value);
}
}
以上代码的缺点:
通过我的研究和实践,发现UIID的hashcode值可能为9位或10位,但不超过10位。所以,String.format("%015d", hashCode)算法会在hashcode值前补至少5个无意义的0,属于占着茅坑不拉屎的角色,实在是对仅有的16位编码的位置浪费。小编的做法,是补全至10位,将前6位充分利用,不仅要达到进一步降低重复概率的目的,还要增强编码的可读性。
我的写法:
public static void get16UUID(){
// 1.开头两位,标识业务代码或机器代码(可变参数)
String machineId = 11;
// 2.中间四位整数,标识日期
SimpleDateFormat sdf = new SimpleDateFormat("MMdd");
String dayTime = sdf.format(new Date());
// 3.生成uuid的hashCode值
int hashCode = UUID.randomUUID().toString().hashCode();
// 4.可能为负数
if(hashCode < 0){
hashCode = -hashCode;
}
// 5.算法处理: 0-代表前面补充0; 10-代表长度为10; d-代表参数为正数型
String value = machineId + dayTime + String.format("%010d", hashCode);
System.out.println(value);
}
结果示例:1110242019091420
原则:不改变核心代码
算法:业务代码 + 日期 + HashCode值
目的:进一步降低编码重复概率的同时,增强其可读性,使其具备一定的业务含义
其中,第二步对中间四位的操作,也可使用四位随机数代替,如下:
......
// 2.生成四位随机整数
int valueOf = (int)((Math.random()*9+1)*1000);
......
// 5.算法处理: 0-代表前面补充0; 10-代表长度为10; d-代表参数为正数型
String value = machineId + valueOf + String.format("%010d", hashCode);
......
建议:
对于UUID的hashcode值,小编亲测并发运行100万次无重复。实际开发中,再加上机器代码、业务代码、日期,估计重复可能只能存在于理论层面了。
即便如此,还是废一句很必要的话:在存储数据的时候,还是建议先判断一下主键是否存在,不要嫌麻烦。
更多精彩,请关注我的"今日头条号":Java云笔记
随时随地,让你拥有最新,最便捷的掌上云服务
Java16位订单号,Java通过UUID生成16位唯一订单号相关推荐
- java.util.UUID生成32位唯一uuid
package com.dhcc.csm.utils; import java.util.UUID: public class UUIDUtil { public static String gene ...
- 生成16位卡号和激活码
生成16位不重复数字,每四位"-"隔开 16位卡号 工具类(规则可自己修改生成) 用例 卡号(16位数字,每4位之间用-隔开) 激活码(12位数字+随机字母) 16位卡号 工具类( ...
- php生成16位不重复随机码,PHP n个不重复的随机数生成代码
复制代码代码如下: //range是将1到100列成一个数组 $numbers=range(1,100); //shuffle将数组顺序随即打乱 shuffle($numbers); //array_ ...
- 如何生成16位流水号
如何生成16位流水号 原文:如何生成16位流水号 /*** @Description: 获取long类型16流水号* @return serialNo long类型16流水号* @date 2017年 ...
- 使用UUID生成32位ID
UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.按照开放软件基金会(OSF)制定的标准计算, ...
- uuid生成8位随机编码
public class UUIDUtils {//字符库public static String[] chars = new String[] { "a", "b&qu ...
- UUID生成10位纯数字
public static void main(String[] args) {int hashCode = java.util.UUID.randomUUID().toString().hashCo ...
- Java工具类(生成6位随机密码)
/** * 生成6位随机密码 * */ public class CreatePasswordUtil { private static Random getR = new Random(); pub ...
- 使用VS在64位平台下编译代码,生成64位dll
最近要把一个之前在32位平台下编译的项目改成64位平台,之前从来没搞过关于64位的东西,所以到处查资料,所幸搞成功了,把过程记录一下,防止以后忘记. 首先声明:64位平台无法直接调用32位dll,32 ...
最新文章
- “智能”基石:人工智能数据标注与训练,是决定智能时代的第一步
- ftp服务器搭建(离线安装vsftpd),配置
- myeclipse中ALT+/怎么不管用了
- Android笔记 采用httpclient提交数据到服务器demo
- JQ实现标签栏切换效果、导航栏下滑效果以及动画队列和stop()方法
- 第一百天 how can i 坚持
- Kubernetes 小白学习笔记(27)--kubernetes的运维-Trouble Shooting方法
- 空头平仓什么意思_什么是白糖期货期权仿真交易套利机会?
- HTTP报文结构详解
- SMT阻容件封装尺寸
- C语言,进制转换之十六进制转二进制,完整代码
- c语言1到100奇数和与偶数和,C语言实现1到100的和奇数与偶数和
- 科学计算机已知角度和边长怎样算斜长,计算公式
- linux shell 三元运算符,语法 - Bash中的三元运算符(?:)
- python+opencv-03 高斯模糊
- 第七届XCTF国际网络攻防联赛总决赛圆满落幕!
- 强大的地图库--Leaflet.js爬坑记录(2)
- C# VLC视频播放器
- 一个拖动鼠标写字的效果
- Linux学习-67-日志服务器设置和日志分析工具(logwatch)安装及使用
热门文章
- 首季度NAND闪存市场呈现萎缩,东芝抢占份额
- 使用黑莓8900通过蓝牙连接华为交换机进行现场网络配置与操作(一)
- 大工17春c和c语言程序设计在线作业1,大工18春《汇编语言程序设计》在线测试123满分...
- 第三章 处理器调度与死锁--笔记
- LoRa时分多址实现多对一发送
- GNSS相关网站汇总
- RAW Power for Mac(强大的raw图像处理软件)
- 物联网可编程逻辑控制器(一)
- Cookie TCP/IP Https
- ACM3108/ACM3128/ACM3129功放芯片动态调整升压延长音箱电池续航