牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

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 = (short0;
 
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();
 }


}


posted on 2008-05-19 10:02 杨粼波 阅读(466) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理