Hibernate中UUID的生成算法

代码引用原文传送门:http://www.yuanma.org/data/2006/1209/article_1925.htm

view plaincopy to clipboardprint?
package Test;  
 
import java.io.Serializable;  
import java.net.InetAddress;  
 
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();  
    }  
 

package Test;

import java.io.Serializable;
import java.net.InetAddress;

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

}
 

调用代码如下:

view plaincopy to clipboardprint?
package Test;  
 
public class Test100 {  
      
    public static void main (String args[]) {  
          
        UUIDGenerator uu = new UUIDGenerator();  
          
        for (int i = 0; i < 1000; i++) {  
              
            System.out.println(uu.generate().toString());  
              
        }  
    }  

 

暂时没有人发言

我要发言

 

点击换一张验证码