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. pip install 默认安装路径修改
  2. 困扰人工智能50多年的常识问题,是否迎来“破局”?
  3. 【DataBase】【SQL语言】【第三天】
  4. 天气模式_江西现罕见持续阴雨寡照天气 市民开启“花式吐槽”模式
  5. 张洁的新书「流浪的老狗」
  6. linux挂载cifs磁盘_linux使用windows磁盘,挂载共享目录
  7. linux临时挂载别的文件目录_linux基础05:linux系统目录有哪些?命令行界面如何切换目录?...
  8. 图论 —— 生成树 —— 增量最小生成树
  9. HDU 5536 字典树
  10. asp.net+sql数据库学生信息管理系统
  11. Python文章归档
  12. Wireless Network(并查集)
  13. 计算从1加到该整数的值c语言,C语言编程题库与解析1.doc
  14. NEC电话交换机基础操作
  15. MCU控制继电器的电路详解
  16. 大数据的概念、特点及应用场景
  17. Unity 百度智能对话API
  18. PhxRPC源码简析
  19. C++题目:因数最多
  20. 希特管理学(希特)【内容摘要】

热门文章

  1. [转]JS设计模式-单例模式(二)
  2. python爬虫实战(一)--------中国作物种质信息网
  3. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)
  4. |洛谷|分治|P2799 国王的魔镜
  5. 1、操作系统基础概念
  6. Android Studio 代码自动提示无效
  7. Operating System-进程/线程内部通信-信号量和PV操作
  8. [LeetCode 题解]: Rotate List
  9. Asp.net 导入Excel(服务器不带Office)
  10. HBase性能优化方法总结(4):读表操作