Hibernate中UUID的生成算法

/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:王力猛 (wallimn)
电邮:wallimn@sohu.com
博客:http://wallimn.bokee.com
   http://blog.csdn.net/wallimn
时间:2006-11-15
/***********本人原创,欢迎转载,转载请保留本人信息*************/

  不知大家在写数据库程序的时候使用什么做主键,使用无意义的东东做主键是个很好的做法,很多人用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();
 }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值