UUID.randomUUID() 生成的 UUID 是无序的,如果作为数据主键,不利于索引

Hibernate 的 UUIDHexGenerator.generate() 方法可以生成有序的 UUID, 本文参考其实现:

public class SequentialUuidHexGenerator extends AbstractUUIDGenerator{private static final String sep = "-";public static String generate() {returnformat( getJVM() ) + sep+ format( getHiTime() ) + sep+ format( getLoTime() ) + sep+ format( getIP() ) + sep+ format( getCount() );}protected static String format(int intValue) {String formatted = Integer.toHexString( intValue );StringBuilder buf = new StringBuilder( "00000000" );buf.replace( 8 - formatted.length(), 8, formatted );return buf.toString();}protected  static String format(short shortValue) {String formatted = Integer.toHexString( shortValue );StringBuilder buf = new StringBuilder( "0000" );buf.replace( 4 - formatted.length(), 4, formatted );return buf.toString();}
}

UUIDHexGenerator.generate() 将 IP 放在首位,考虑到在不同的机器生成,本文将时间戳放在了首位

AbstractUUIDGenerator 代码:

public abstract class AbstractUUIDGenerator {private static final int IP;static {int ipadd;try {ipadd = BytesHelper.toInt( InetAddress.getLocalHost().getAddress() );}catch (Exception e) {ipadd = 0;}IP = ipadd;}private static short counter = (short) 0;private static final int JVM = (int) ( System.currentTimeMillis() >>> 8 );public  AbstractUUIDGenerator() {}protected static int getJVM() {return JVM;}protected static short getCount() {synchronized(AbstractUUIDGenerator.class) {if ( counter < 0 ) {counter=0;}return counter++;}}protected static int getIP() {return IP;}protected static short getHiTime() {return (short) ( System.currentTimeMillis() >>> 32 );}protected static int getLoTime() {return (int) System.currentTimeMillis();}
}

BytesHelper 代码:

public final class BytesHelper {private BytesHelper() {}public static int toInt(byte[] bytes) {int result = 0;for ( int i = 0; i < 4; i++ ) {result = ( result << 8 ) - Byte.MIN_VALUE + (int) bytes[i];}return result;}
}

完整代码:GitHub

转载于:https://www.cnblogs.com/victorbu/p/11098647.html

Java 生成有序 UUID相关推荐

  1. JAVA生成UUID并作为数据库表的ID

    在接触UUID之前,我建表用的ID一直是用的int型,然后自动增长,这样很方便. 但是这样做却有一些问题,因为数据量大的话,不可能只用一张表,而是几张表,这样会出现id重复,于是有了UUID. UUI ...

  2. Java中使用UUID工具类生成唯一标志防止重复

    场景 UUID 是指Universally Unique Identifier,翻译为中文是通用唯一识别码,UUID 的目的是让分布式系统中的所有元素都能有唯一的识别信息. 在某些场景下需要给数据库中 ...

  3. java生成UUID通用唯一识别码

    一.UUID概述 UUID含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准,也是被开源软件基金会 (Open Software Founda ...

  4. 怎样用java生成GUID与UUID

    GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随机数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...

  5. java 生成uuid

    1.UUID 简介 UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准. 也是被开源软件基金会 (Open Software Fou ...

  6. Java生成UUID的常用方式

    java.util.UUID类来生成UUID import java.util.UUID;public class UUIDGenerator {public static void main(Str ...

  7. JAVA生成20位LONG型UUID

    编者在开发过程中用postman测试接口,发现要求id为必填且不能含有英文字母,问了对面开发人员才知道需要自己生成20位Long型uuid,写法大概如下,在需要生成的部分调用这个类即可. packag ...

  8. java生成UUID的方法总结

    转自:https://blog.csdn.net/xinghuo0007/article/details/72868799 java生成UUID的方法总结 前言: 我们开发的时候,数据库表总会有一个主 ...

  9. 用java生成不重复的字符串UUID.randomUUID().toString()

    目录 0.码仙励志 1.原理 3.使用 4.去掉中间的横线 0.码仙励志 过去的靠现在忘记,将来的靠现在努力,现在才最重要 1.原理 UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器 ...

最新文章

  1. 下拉列表JComboBox,列表框JList
  2. windows server 2016 安装指南
  3. HTML - embed 与 object 之争
  4. SVN switch 用法详解 (ZZ)
  5. android调频收音机代码,android 收音机 FM 驱动 hal层 框架层以及应用层代码
  6. linux 产生0~100内的随机数
  7. JavaScript实现isPowerOfTwo算法(附完整源码)
  8. Request_获取请求参数中文乱码问题处理
  9. java中render用法_如何在React中不在render函数中使用setState
  10. 正则表达式 正整数_史上最全的正则表达式 (1) -- 校验数字的表达式
  11. Git 提交错了不用慌,这三招帮你修改记录
  12. JIRA OutOfMemoryErrors
  13. win7桌面运行html,手把手教你win7电脑如何运行config的操作教程
  14. winserver 08 64位安装sql05 64位提示asp版本注册
  15. javascript AOP实现
  16. Wordle_1.0
  17. 第九届蓝桥杯C++A组
  18. 达梦 DCA 培训总结
  19. 当天剩余时间,当月剩余时间(秒数),用于redis设置过期时间
  20. hp ux安装mysql5.1.56_详细讲解Linux环境下MySQL5.1安装步骤

热门文章

  1. shell编程必须要掌握的命令-xargs
  2. win10设置默认输入法
  3. LiveGBS无插件播放页面的集成----单独的播放器样式
  4. Nginx配置反向代理与负载均衡
  5. 登录状态保持Session/Cookie
  6. img 标签 访问图片 返回403 forbidden问题
  7. 【洛谷P1381】单词背诵
  8. 页面重新跳转到父类url
  9. EXTJS 重新加载树结点
  10. 【C 语言】数组 ( 数组取值操作 | array[i][j] 用法 等价于 *( *(array = i) + j ) 用法 | 下标操作到指针操作演化过程 )