Java 生成有序 UUID
UUID.randomUUID() 生成的 UUID 是无序的,如果作为数据主键,不利于索引
Hibernate 的 UUIDHexGenerator.generate() 方法可以生成有序的 UUID, 本文参考其实现:
public class SequentialUuidHexGenerator extends AbstractUUIDGenerator{
private static final String sep = "-";
public static String generate() {
return
format( 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
Java 生成有序 UUID的更多相关文章
- java生成随机字符串uuid
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随即数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
- Java生成唯一GUID UUID
GUID(Global unique identifier)全局唯一标识符,它是由网卡上的标识数字(每个网卡都有唯一的标识号)以及 CPU 时钟的唯一数字生成的的一个 16 字节的二进制值. GUID ...
- java生成UUID通用唯一识别码 (Universally Unique Identifier)
转自:http://blog.csdn.net/carefree31441/article/details/3998553 UUID含义是通用唯一识别码 (Universally Unique Ide ...
- (转)java生成UUID通用唯一识别码 (Universally Unique Identifier)
(原文链接:http://blog.csdn.net/carefree31441/article/details/3998553) UUID含义是通用唯一识别码 (Universally Uniq ...
- java自带uuid生成
java自带uuid生成UUID.randomUUID().toString()
- 利用Java生成UUID
UUID是什么? UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分.其目的,是 ...
- java生成UUID
UUID介绍: UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.按照开放软件基金会(OSF) ...
- java 生成GUID与UUID
java 生成GUID与UUID CreateTime--2018年5月31日16点29分 Author:Marydon import java.util.UUID; public static ...
- 怎样用java生成GUID与UUID
GUID是一个128位长的数字,一般用16进制表示.算法的核心思想是结合机器的网卡.当地时间.一个随机数来生成GUID.从理论上讲,如果一台机器每秒产生10000000个GUID,则可以保证(概率意义 ...
随机推荐
- 我的第二次C语言作业
这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/SE2020-2/homework/11422 这个作业要求在哪里 https://www.cnblog ...
- java 执行shell命令及日志收集避坑指南
有时候我们需要调用系统命令执行一些东西,可能是为了方便,也可能是没有办法必须要调用.涉及执行系统命令的东西,则就不能做跨平台了,这和java语言的初衷是相背的. 废话不多说,java如何执行shell ...
- DM的SQL优化入门笔记
1.查看执行计划EXPLAIN SELECT A.C1+1,B.D2 FROM T1 A, T2 B WHERE A.C1 = B.D1; 2.执行计划: 1 #NSET2: [0, 16, 9] 2 ...
- 【SpringBoot】03.SpringBoot整合Servlet的两种方式
SpringBoot整合Servlet的两种方式: 1. 通过注解扫描完成Servlet组件注册 新建Servlet类继承HttpServlet 重写超类doGet方法 在该类使用注解@WebServ ...
- Hangfire只允许同时运行同一个任务
Hangfire有个机制可以确保所有任务都会被执行,如果当服务器停机了一段时间重新启动时,在此期间的周期任务会几乎同时执行.而大部分时候,我们希望同个周期任务每段时间只运行一个就行了. 或者是如果周期 ...
- leetcode133:3sum-closest
题目描述 给出含有n个整数的数组s,找出s中和加起来的和最接近给定的目标值的三个整数.返回这三个整数的和.你可以假设每个输入都只有唯一解. 例如,给定的整数 S = {-1 2 1 -4}, 目标值 ...
- CSS3之径向渐变
设置最终形状参数: ellipse circle 设置长半轴和短半轴 设置椭圆对称中心 设置色标 输出代码: radial-gradient(circle closest-side at ce ...
- html的height:100%;高度是多少
html的height:100%;高度是多少 html设置height:100%;表示一屏高度,类似于100vh.未设置则根据子元素的高度来自适应高.在实际应用中,设置页面高度为1屏幕高度通常设置: ...
- grep/字符/次数匹配/锚定符/小大括号/wc/tr/cut/sort/uniq
grep:正则表达式,文本过滤工具,能够实现以指定的"模式(Pattern)"逐行搜索文件中的内容,并将匹配到的行显示出来. 模式:是由正则表达式的元字符,其他字符组合起来的匹配字 ...
- Innodb表空间迁移过程
1.大致流程 将a实例的表的数据迁移到b实例上. 1.在目标实例b上创建一个相同的表 2.在目标库b上执行ALTER TABLE t DISCARD TABLESPACE; 3.在源库a上执行FLUS ...