小编在工作中遇到了标题中的场景,先查了一些微博,参考下大佬经验。最终发现大家写的都是一套代码,没有太多的信息量做对比,并且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位唯一订单号相关推荐

  1. java.util.UUID生成32位唯一uuid

    package com.dhcc.csm.utils; import java.util.UUID: public class UUIDUtil { public static String gene ...

  2. 生成16位卡号和激活码

    生成16位不重复数字,每四位"-"隔开 16位卡号 工具类(规则可自己修改生成) 用例 卡号(16位数字,每4位之间用-隔开) 激活码(12位数字+随机字母) 16位卡号 工具类( ...

  3. php生成16位不重复随机码,PHP n个不重复的随机数生成代码

    复制代码代码如下: //range是将1到100列成一个数组 $numbers=range(1,100); //shuffle将数组顺序随即打乱 shuffle($numbers); //array_ ...

  4. 如何生成16位流水号

    如何生成16位流水号 原文:如何生成16位流水号 /*** @Description: 获取long类型16流水号* @return serialNo long类型16流水号* @date 2017年 ...

  5. 使用UUID生成32位ID

    UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.按照开放软件基金会(OSF)制定的标准计算, ...

  6. uuid生成8位随机编码

    public class UUIDUtils {//字符库public static String[] chars = new String[] { "a", "b&qu ...

  7. UUID生成10位纯数字

    public static void main(String[] args) {int hashCode = java.util.UUID.randomUUID().toString().hashCo ...

  8. Java工具类(生成6位随机密码)

    /** * 生成6位随机密码 * */ public class CreatePasswordUtil { private static Random getR = new Random(); pub ...

  9. 使用VS在64位平台下编译代码,生成64位dll

    最近要把一个之前在32位平台下编译的项目改成64位平台,之前从来没搞过关于64位的东西,所以到处查资料,所幸搞成功了,把过程记录一下,防止以后忘记. 首先声明:64位平台无法直接调用32位dll,32 ...

最新文章

  1. “智能”基石:人工智能数据标注与训练,是决定智能时代的第一步
  2. ftp服务器搭建(离线安装vsftpd),配置
  3. myeclipse中ALT+/怎么不管用了
  4. Android笔记 采用httpclient提交数据到服务器demo
  5. JQ实现标签栏切换效果、导航栏下滑效果以及动画队列和stop()方法
  6. 第一百天 how can i 坚持
  7. Kubernetes 小白学习笔记(27)--kubernetes的运维-Trouble Shooting方法
  8. 空头平仓什么意思_什么是白糖期货期权仿真交易套利机会?
  9. HTTP报文结构详解
  10. SMT阻容件封装尺寸
  11. C语言,进制转换之十六进制转二进制,完整代码
  12. c语言1到100奇数和与偶数和,C语言实现1到100的和奇数与偶数和
  13. 科学计算机已知角度和边长怎样算斜长,计算公式
  14. linux shell 三元运算符,语法 - Bash中的三元运算符(?:)
  15. python+opencv-03 高斯模糊
  16. 第七届XCTF国际网络攻防联赛总决赛圆满落幕!
  17. 强大的地图库--Leaflet.js爬坑记录(2)
  18. C# VLC视频播放器
  19. 一个拖动鼠标写字的效果
  20. Linux学习-67-日志服务器设置和日志分析工具(logwatch)安装及使用

热门文章

  1. 首季度NAND闪存市场呈现萎缩,东芝抢占份额
  2. 使用黑莓8900通过蓝牙连接华为交换机进行现场网络配置与操作(一)
  3. 大工17春c和c语言程序设计在线作业1,大工18春《汇编语言程序设计》在线测试123满分...
  4. 第三章 处理器调度与死锁--笔记
  5. LoRa时分多址实现多对一发送
  6. GNSS相关网站汇总
  7. RAW Power for Mac(强大的raw图像处理软件)
  8. 物联网可编程逻辑控制器(一)
  9. Cookie TCP/IP Https
  10. ACM3108/ACM3128/ACM3129功放芯片动态调整升压延长音箱电池续航