Hibernate中UUID的生成算法

简介:

不知大家在写数据库程序的时候使用什么做主键,使用无意义的东东做主键是个很好的做法,很多人用SEQUENCE,可我觉得Hibernate中的UUID是个不错的选择,我把他剥出来,喜欢的人可以拿去用。
算法如下:


package com.xxh.hz.util;

import java.io.Serializable;
import java.net.InetAddress;
/**
 * 唯一主键生成办法。从Hibernate中提取出来。我一直觉得这不错,不用建什么Sequence
 * @version      :  V1.0
 * @author       : 王力猛(Email: wallimn@sohu.com  QQ: 54871876)
 * @date           : 2006-12-8 下午11:51:43
 
*/

public  class UUIDGenerator  {

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

  return result;
 }

 static {
  int ipadd;
  try {
   ipadd = IptoInt( 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 UUIDGenerator() {
 }


 /**
  * Unique across JVMs on this machine (unless they load this class
  * in the same quater second - very unlikely)
  
*/

 protected int getJVM() {
  return JVM;
 }


 /**
  * Unique in a millisecond for this JVM instance (unless there
  * are > Short.MAX_VALUE instances created in a millisecond)
  
*/

 protected short getCount() {
  synchronized(UUIDGenerator.class{
   if (counter<0) counter=0;
   return counter++;
  }

 }


 /**
  * Unique in a local network
  
*/

 protected int getIP() {
  return IP;
 }


 /**
  * Unique down to millisecond
  
*/

 protected short getHiTime() {
  return (short) ( System.currentTimeMillis() >>> 32 );
 }

 protected int getLoTime() {
  return (int) System.currentTimeMillis();
 }

 
 private final static String sep = "";

 protected String format(int intval) {
  String formatted = Integer.toHexString(intval);
  StringBuffer buf = new StringBuffer("00000000");
  buf.replace( 8-formatted.length(), 8, formatted );
  return buf.toString();
 }


 protected String format(short shortval) {
  String formatted = Integer.toHexString(shortval);
  StringBuffer buf = new StringBuffer("0000");
  buf.replace( 4-formatted.length(), 4, formatted );
  return buf.toString();
 }


 public Serializable generate() {
  return new StringBuffer(36)
   .append( format( getIP() ) ).append(sep)
   .append( format( getJVM() ) ).append(sep)
   .append( format( getHiTime() ) ).append(sep)
   .append( format( getLoTime() ) ).append(sep)
   .append( format( getCount() ) )
   .toString();
 }


}
目录
相关文章
|
7月前
|
算法 云计算 索引
生成UUID和自定义UUID算法
生成UUID和自定义UUID算法
460 0
|
存储 算法 安全
全局唯一ID(自增ID、UUID、雪花算法)
一、介绍 系统唯一id是我们在设计阶段常常遇到的问题。在复杂的分布式系统中,几乎都需要对大量的数据和消息进行唯一标识。在设计初期,我们需要考虑日后数据量的级别,如果可能会对数据进行分库分表,那么就需要有一个全局唯一id来标识一条数据或记录。生成唯一id的策略有多种,但是每种策略都有它的适用场景、优点以及局限性。
|
存储 运维 算法
UUID和雪花(Snowflake)算法该如何选择?
UUID和雪花(Snowflake)算法该如何选择?
342 0
|
算法 Java Scala
UUID的弊端以及雪花算法 下
UUID的弊端以及雪花算法 下
|
算法 安全 Java
数据库如何合理生成主键:UUID、雪花算法
1.使用自增主键的弊端 首先在实际工程中我们很少用1,2,3......这样的自增主键,原因如下: 主键冲突 性能问题 安全问题 主键冲突: 比如我要跨数据库进行数据同步、或者在分布式系统中跨“分区”进行数据同步,不难想象,1,2,3......这种递增的单数字是极容易产生冲突的。
419 0
|
存储 NoSQL 算法
UUID的弊端以及雪花算法 上
UUID的弊端以及雪花算法 上
|
存储 算法 NoSQL
说起分布式自增ID只知道UUID?SnowFlake(雪花)算法了解一下(Python3实现)
但凡说起分布式系统,我们肯定会对一些海量级的业务进行分拆,比如:用户表,订单表。因为数据量巨大一张表完全无法支撑,就会对其进行分库分表。但是一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题,当我们使用mysql的自增长主键(auto\_increment)时,充分感受到了它的好处:整个系统ID唯一,ID是数字类型,而且是趋势递增的,ID简短,查询效率快,在分布式系统中显然由于单点问题无法使用mysql自增长了,此时需要别的解决方案来支撑分布式业务。
说起分布式自增ID只知道UUID?SnowFlake(雪花)算法了解一下(Python3实现)
|
Java 数据库连接
【hibernate】主键生成策略使用UUID报出如下警告:org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.hibernate.id.UUIDHexGenerator which does not generate IETF RFC
主键生成策略使用UUID报出如警告如下: 控制台- 2017-11-24 18:40:14 [restartedMain] WARN org.hibernate.id.UUIDHexGenerator - HHH000409: Using org.
2460 0
下一篇
DataWorks