Java生成UUID

Java生成UUID

 UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。由以下几部分的组合:当前日期和时间(UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒又生成一个UUID,则第一个部分不同,其余相同),时钟序列,全局唯一的IEEE机器识别号(如果有网卡,从网卡获得,没有网卡以其他方式获得),UUID的唯一缺陷在于生成的结果串会比较长。

在Java中生成UUID主要有以下几种方式:

1. JDK1.5
如果使用的JDK1.5的话,那么生成UUID变成了一件简单的事,以为JDK实现了UUID: java.util.UUID,直接调用即可.
UUID uuid  =  UUID.randomUUID();

2. 第三方开源类库(推荐使用):
最著名的是 JUG .特点上是: 纯Java实现,开源,LGPL协议。采用了Native的方式产生真正的Uuid.而且提供了不同平台的实现,包括:

    * Linux / x86
    * Windows (98, ME, NT, 2K, XP?) / x86
    * Solaris / Sparc
    * Mac OS X
    * FreeBSD / x86

import  org.doomdark.uuid.UUID;
import  org.doomdark.uuid.UUIDGenerator;

UUIDGenerator generator  =  UUIDGenerator.getInstance();
UUID uuid  =  generator.generateRandomBasedUUID();

3. Java代码实现:
如果你使用JDK1.4或以前版本,又不想加入第三方的类库的话,下面提供了一个纯Java的UUID实现. 不过需要注意的是:这里产生的可能不是真正的UUID,只不过重复的机会少一些而已。
import  java.net.InetAddress;
import  java.net.UnknownHostException;

/** */ /**
 * UUID(Univeral Unique Identity)类
 *


 * Title: 生成唯一编码
 *

 *


 * Description: 源自于w3c.org <</font>
http://源自于w3c.org >
 *
 *


 * Copyright: Copyright (c) 2001-2004
 *

 *
 *  @version  1.0
  */
public   final   class  UUID  {

     /** */ /**
     *  @serial  Integer that helps create a unique UID.
      */
     private   int  unique;

     /** */ /**
     *  @serial  Long used to record the time. The time will be
     *         used to create a unique UID.
      */
     private   long  time;

     /** */ /**
     * InetAddress to make the UID globally unique
      */
     private   static  String address;

     /** */ /**
     * a random number
      */
     private   static   int  hostUnique;

     /** */ /**
     * Used for synchronization
      */
     private   static  Object mutex;

     private   static   long  lastTime;

     private   static   long  DELAY;

     private   static  String generateNoNetworkID()  {
        Thread current  =  Thread.currentThread();
        String nid  =  current.activeCount()  +  System.getProperty( " os.version " )
                 +  System.getProperty( " user.name  " )
                 +  System.getProperty( " java.version " );
        System.out.println( " netWorkId = "   +  nid);
        MD5 md5  =   new  MD5(nid);
        md5.processString();
         return  md5.getStringDigest();
    }

     static   {
        hostUnique  =  ( new  Object()).hashCode();
        mutex  =   new  Object();
        lastTime  =  System.currentTimeMillis();
        DELAY  =   10 ;  //  in milliseconds
         try   {
            String s  =  InetAddress.getLocalHost().getHostAddress();
            MD5 md5  =   new  MD5(s);
            md5.processString();
            address  =  md5.getStringDigest();
        }   catch  (UnknownHostException ex)  {
            address  =  generateNoNetworkID();
        }
    }

     public  UUID()  {
         synchronized  (mutex)  {
             boolean  done  =   false ;
             while  ( ! done)  {
                time  =  System.currentTimeMillis();
                 if  (time   lastTime  +  DELAY)  {
                     //  pause for a second to wait for time to change
                     try   {
                        Thread.currentThread().sleep(DELAY);
                    }   catch  (java.lang.InterruptedException e)  {
                    }   //  ignore exception
                     continue ;
                }   else   {
                    lastTime  =  time;
                    done  =   true ;
                }
            }
            unique  =  hostUnique;
        }
    }

     public  String toString()  {
         return  Integer.toString(unique,  16 )  +  Long.toString(time,  16 )  +  address;
    }

     public   boolean  equals(Object obj)  {
         if  ((obj  !=   null )  &&  (obj  instanceof  UUID))  {
            UUID uuid  =  (UUID) obj;
             return  (unique  ==  uuid.unique  &&  time  ==  uuid.time  &&  address
                    .equals(uuid.address));
        }   else   {
             return   false ;
        }
    }

     public   static   void  main(String args[])  {
        System.out.println( new  UUID());
        System.out.println( new  UUID());
        System.out.println( new  UUID());
         long  start  =  System.currentTimeMillis();
        System.out.println( new  UUID());
         long  end  =  System.currentTimeMillis();
        System.out.println((end  -  start));
        System.out.println( new  UUID().toString().length());
    }

     /** */ /**
     * 返回最新的UUID号码
     *
     *  @return  String UUID,长50位
     *
      */
     public   final   static  String getUUID()  {
        UUID uid  =   new  UUID();
         return  uid.toString();
    }
}

其中使用到MD5加密算法,实现代码如下:

import  java.io.ByteArrayInputStream;
import  java.io.File;
import  java.io.FileInputStream;
import  java.io.IOException;
import  java.io.InputStream;
import  java.io.UnsupportedEncodingException;

/** */ /**
 * MD5 加密算法类
 *
 *


 * Description: 源自于w3c.org <</font>
http://源自于w3c.org >
 *
 *


 * Copyright: Copyright (c) 2001-2004
 *

 *
 *  @version  1.0
  */
public   class  MD5  {
     private   static   final   int  BUFFER_SIZE  =   1024 ;

     private   static   final   int  S11  =   7 ;

     private   static   final   int  S12  =   12 ;

     private   static   final   int  S13  =   17 ;

     private   static   final   int  S14  =   22 ;

     private   static   final   int  S21  =   5 ;

     private   static   final   int  S22  =   9 ;

     private   static   final   int  S23  =   14 ;

     private   static   final   int  S24  =   20 ;

     private   static   final   int  S31  =   4 ;

     private   static   final   int  S32  =   11 ;

     private   static   final   int  S33  =   16 ;

     private   static   final   int  S34  =   23 ;

     private   static   final   int  S41  =   6 ;

     private   static   final   int  S42  =   10 ;

     private   static   final   int  S43  =   15 ;

     private   static   final   int  S44  =   21 ;

     private   static   byte  padding[]  =   { ( byte )  0x80 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 , ( byte )  0 ,
            ( byte )  0  } ;

     private  InputStream in  =   null ;

     private   boolean  stringp  =   false ;

     private   int  state[]  =   null ;

     private   long  count  =   0 ;

     private   byte  buffer[]  =   null ;

     private   byte  digest[]  =   null ;

     private   static  String stringify( byte  buf[])  {
        StringBuffer sb  =   new  StringBuffer( 2   *  buf.length);
         for  ( int  i  =   0 ; i   buf.length; i ++ )  {
             int  h  =  (buf[i]  &   0xf0 )  >>   4 ;
             int  l  =  (buf[i]  &   0x0f );
            sb.append( new  Character(( char ) ((h  >   9 )  ?   ' a '   +  h  -   10  :  ' 0 '   +  h)));
            sb.append( new  Character(( char ) ((l  >   9 )  ?   ' a '   +  l  -   10  :  ' 0 '   +  l)));
        }
         return  sb.toString();
    }

     private   final   int  F( int  x,  int  y,  int  z)  {
         return  ((x  &  y)  |  (( ~ x)  &  z));
    }

     private   final   int  G( int  x,  int  y,  int  z)  {
         return  ((x  &  z)  |  (y  &  ( ~ z)));
    }

     private   final   int  H( int  x,  int  y,  int  z)  {
         return  (x  ^  y  ^  z);
    }

     private   final   int  I( int  x,  int  y,  int  z)  {
         return  (y  ^  (x  |  ( ~ z)));
    }

     private   final   int  rotate_left( int  x,  int  n)  {
         return  ((x  <<</span>  n) | (x >>> (32 -  n)));
    }

     private   final   int  FF( int  a,  int  b,  int  c,  int  d,  int  x,  int  s,  int  ac)  {
        a  +=  (F(b, c, d)  +  x  +  ac);
        a  =  rotate_left(a, s);
        a  +=  b;
         return  a;
    }

     private   final   int  GG( int  a,  int  b,  int  c,  int  d,  int  x,  int  s,  int  ac)  {
        a  +=  (G(b, c, d)  +  x  +  ac);
        a  =  rotate_left(a, s);
        a  +=  b;
         return  a;
    }

     private   final   int  HH( int  a,  int  b,  int  c,  int  d,  int  x,  int  s,  int  ac)  {
        a  +=  (H(b, c, d)  +  x  +  ac);
        a  =  rotate_left(a, s);
        a  +=  b;
         return  a;
    }

     private   final   int  II( int  a,  int  b,  int  c,  int  d,  int  x,  int  s,  int  ac)  {
        a  +=  (I(b, c, d)  +  x  +  ac);
        a  =  rotate_left(a, s);
        a  +=  b;
         return  a;
    }

     private   final   void  decode( int  output[],  byte  input[],  int  off,  int  len)  {
         int  i  =   0 ;
         int  j  =   0 ;
         for  (; j   len; i ++ , j  +=   4 )  {
            output[i]  =  ((( int ) (input[off  +  j]  &   0xff ))
                     |  ((( int ) (input[off  +  j  +   1 ]  &   0xff ))  <<</span>  8 )
                     |  ((( int ) (input[off  +  j  +   2 ]  &   0xff ))  <<</span>  16) | (((int ) (input[off
                     +  j  +   3 ]  &   0xff ))  <<</span>  24 ));
        }
    }

     private   final   void  transform( byte  block[],  int  offset)  {
         int  a  =  state[ 0 ];
         int  b  =  state[ 1 ];
         int  c  =  state[ 2 ];
         int  d  =  state[ 3 ];
         int  x[]  =   new   int [ 16 ];

        decode(x, block, offset,  64 );
         /**/ /*  Round 1  */
        a  =  FF(a, b, c, d, x[ 0 ], S11,  0xd76aa478 );  /**/ /*  1  */
        d  =  FF(d, a, b, c, x[ 1 ], S12,  0xe8c7b756 );  /**/ /*  2  */
        c  =  FF(c, d, a, b, x[ 2 ], S13,  0x242070db );  /**/ /*  3  */
        b  =  FF(b, c, d, a, x[ 3 ], S14,  0xc1bdceee );  /**/ /*  4  */
        a  =  FF(a, b, c, d, x[ 4 ], S11,  0xf57c0faf );  /**/ /*  5  */
        d  =  FF(d, a, b, c, x[ 5 ], S12,  0x4787c62a );  /**/ /*  6  */
        c  =  FF(c, d, a, b, x[ 6 ], S13,  0xa8304613 );  /**/ /*  7  */
        b  =  FF(b, c, d, a, x[ 7 ], S14,  0xfd469501 );  /**/ /*  8  */
        a  =  FF(a, b, c, d, x[ 8 ], S11,  0x698098d8 );  /**/ /*  9  */
        d  =  FF(d, a, b, c, x[ 9 ], S12,  0x8b44f7af );  /**/ /*  10  */
        c  =  FF(c, d, a, b, x[ 10 ], S13,  0xffff5bb1 );  /**/ /*  11  */
        b  =  FF(b, c, d, a, x[ 11 ], S14,  0x895cd7be );  /**/ /*  12  */
        a  =  FF(a, b, c, d, x[ 12 ], S11,  0x6b901122 );  /**/ /*  13  */
        d  =  FF(d, a, b, c, x[ 13 ], S12,  0xfd987193 );  /**/ /*  14  */
        c  =  FF(c, d, a, b, x[ 14 ], S13,  0xa679438e );  /**/ /*  15  */
        b  =  FF(b, c, d, a, x[ 15 ], S14,  0x49b40821 );  /**/ /*  16  */
         /**/ /*  Round 2  */
        a  =  GG(a, b, c, d, x[ 1 ], S21,  0xf61e2562 );  /**/ /*  17  */
        d  =  GG(d, a, b, c, x[ 6 ], S22,  0xc040b340 );  /**/ /*  18  */
        c  =  GG(c, d, a, b, x[ 11 ], S23,  0x265e5a51 );  /**/ /*  19  */
        b  =  GG(b, c, d, a, x[ 0 ], S24,  0xe9b6c7aa );  /**/ /*  20  */
        a  =  GG(a, b, c, d, x[ 5 ], S21,  0xd62f105d );  /**/ /*  21  */
        d  =  GG(d, a, b, c, x[ 10 ], S22,  0x2441453 );  /**/ /*  22  */
        c  =  GG(c, d, a, b, x[ 15 ], S23,  0xd8a1e681 );  /**/ /*  23  */
        b  =  GG(b, c, d, a, x[ 4 ], S24,  0xe7d3fbc8 );  /**/ /*  24  */
        a  =  GG(a, b, c, d, x[ 9 ], S21,  0x21e1cde6 );  /**/ /*  25  */
        d  =  GG(d, a, b, c, x[ 14 ], S22,  0xc33707d6 );  /**/ /*  26  */
        c  =  GG(c, d, a, b, x[ 3 ], S23,  0xf4d50d87 );  /**/ /*  27  */
        b  =  GG(b, c, d, a, x[ 8 ], S24,  0x455a14ed );  /**/ /*  28  */
        a  =  GG(a, b, c, d, x[ 13 ], S21,  0xa9e3e905 );  /**/ /*  29  */
        d  =  GG(d, a, b, c, x[ 2 ], S22,  0xfcefa3f8 );  /**/ /*  30  */
        c  =  GG(c, d, a, b, x[ 7 ], S23,  0x676f02d9 );  /**/ /*  31  */
        b  =  GG(b, c, d, a, x[ 12 ], S24,  0x8d2a4c8a );  /**/ /*  32  */

         /**/ /*  Round 3  */
        a  =  HH(a, b, c, d, x[ 5 ], S31,  0xfffa3942 );  /**/ /*  33  */
        d  =  HH(d, a, b, c, x[ 8 ], S32,  0x8771f681 );  /**/ /*  34  */
        c  =  HH(c, d, a, b, x[ 11 ], S33,  0x6d9d6122 );  /**/ /*  35  */
        b  =  HH(b, c, d, a, x[ 14 ], S34,  0xfde5380c );  /**/ /*  36  */
        a  =  HH(a, b, c, d, x[ 1 ], S31,  0xa4beea44 );  /**/ /*  37  */
        d  =  HH(d, a, b, c, x[ 4 ], S32,  0x4bdecfa9 );  /**/ /*  38  */
        c  =  HH(c, d, a, b, x[ 7 ], S33,  0xf6bb4b60 );  /**/ /*  39  */
        b  =  HH(b, c, d, a, x[ 10 ], S34,  0xbebfbc70 );  /**/ /*  40  */
        a  =  HH(a, b, c, d, x[ 13 ], S31,  0x289b7ec6 );  /**/ /*  41  */
        d  =  HH(d, a, b, c, x[ 0 ], S32,  0xeaa127fa );  /**/ /*  42  */
        c  =  HH(c, d, a, b, x[ 3 ], S33,  0xd4ef3085 );  /**/ /*  43  */
        b  =  HH(b, c, d, a, x[ 6 ], S34,  0x4881d05 );  /**/ /*  44  */
        a  =  HH(a, b, c, d, x[ 9 ], S31,  0xd9d4d039 );  /**/ /*  45  */
        d  =  HH(d, a, b, c, x[ 12 ], S32,  0xe6db99e5 );  /**/ /*  46  */
        c  =  HH(c, d, a, b, x[ 15 ], S33,  0x1fa27cf8 );  /**/ /*  47  */
        b  =  HH(b, c, d, a, x[ 2 ], S34,  0xc4ac5665 );  /**/ /*  48  */

         /**/ /*  Round 4  */
        a  =  II(a, b, c, d, x[ 0 ], S41,  0xf4292244 );  /**/ /*  49  */
        d  =  II(d, a, b, c, x[ 7 ], S42,  0x432aff97 );  /**/ /*  50  */
        c  =  II(c, d, a, b, x[ 14 ], S43,  0xab9423a7 );  /**/ /*  51  */
        b  =  II(b, c, d, a, x[ 5 ], S44,  0xfc93a039 );  /**/ /*  52  */
        a  =  II(a, b, c, d, x[ 12 ], S41,  0x655b59c3 );  /**/ /*  53  */
        d  =  II(d, a, b, c, x[ 3 ], S42,  0x8f0ccc92 );  /**/ /*  54  */
        c  =  II(c, d, a, b, x[ 10 ], S43,  0xffeff47d );  /**/ /*  55  */
        b  =  II(b, c, d, a, x[ 1 ], S44,  0x85845dd1 );  /**/ /*  56  */
        a  =  II(a, b, c, d, x[ 8 ], S41,  0x6fa87e4f );  /**/ /*  57  */
        d  =  II(d, a, b, c, x[ 15 ], S42,  0xfe2ce6e0 );  /**/ /*  58  */
        c  =  II(c, d, a, b, x[ 6 ], S43,  0xa3014314 );  /**/ /*  59  */
        b  =  II(b, c, d, a, x[ 13 ], S44,  0x4e0811a1 );  /**/ /*  60  */
        a  =  II(a, b, c, d, x[ 4 ], S41,  0xf7537e82 );  /**/ /*  61  */
        d  =  II(d, a, b, c, x[ 11 ], S42,  0xbd3af235 );  /**/ /*  62  */
        c  =  II(c, d, a, b, x[ 2 ], S43,  0x2ad7d2bb );  /**/ /*  63  */
        b  =  II(b, c, d, a, x[ 9 ], S44,  0xeb86d391 );  /**/ /*  64  */

        state[ 0 ]  +=  a;
        state[ 1 ]  +=  b;
        state[ 2 ]  +=  c;
        state[ 3 ]  +=  d;
    }

     private   final   void  update( byte  input[],  int  len)  {
         int  index  =  (( int ) (count  >>   3 ))  &   0x3f ;
        count  +=  (len  <<</span>  3 );
         int  partLen  =   64   -  index;
         int  i  =   0 ;
         if  (len  >=  partLen)  {
            System.arraycopy(input,  0 , buffer, index, partLen);
            transform(buffer,  0 );
             for  (i  =  partLen; i  +   63    len; i  +=   64 )
                transform(input, i);
            index  =   0 ;
        }   else   {
            i  =   0 ;
        }
        System.arraycopy(input, i, buffer, index, len  -  i);
    }

     private   byte [] end()  {
         byte  bits[]  =   new   byte [ 8 ];
         for  ( int  i  =   0 ; i    8 ; i ++ )
            bits[i]  =  ( byte ) ((count  >>>  (i  *   8 ))  &   0xff );
         int  index  =  (( int ) (count  >>   3 ))  &   0x3f ;
         int  padlen  =  (index    56 )  ?  ( 56   -  index) : ( 120   -  index);
        update(padding, padlen);
        update(bits,  8 );
         return  encode(state,  16 );
    }

     //  Encode the content.state array into 16 bytes array
     private   byte [] encode( int  input[],  int  len)  {
         byte  output[]  =   new   byte [len];
         int  i  =   0 ;
         int  j  =   0 ;
         for  (; j   len; i ++ , j  +=   4 )  {
            output[j]  =  ( byte ) ((input[i])  &   0xff );
            output[j  +   1 ]  =  ( byte ) ((input[i]  >>   8 )  &   0xff );
            output[j  +   2 ]  =  ( byte ) ((input[i]  >>   16 )  &   0xff );
            output[j  +   3 ]  =  ( byte ) ((input[i]  >>   24 )  &   0xff );
        }
         return  output;
    }

     /** */ /**
     * Get the digest for our input stream. This method constructs the input
     * stream digest, and return it, as a a String, following the MD5 (rfc1321)
     * algorithm,
     *
     *  @return  An instance of String, giving the message digest.
     *  @exception  IOException
     *                Thrown if the digestifier was unable to read the input
     *                stream.
      */

     public   byte [] getDigest()  throws  IOException  {
         byte  buffer[]  =   new   byte [BUFFER_SIZE];
         int  got  =   - 1 ;

         if  (digest  !=   null )
             return  digest;
         while  ((got  =  in.read(buffer))  >   0 )
            update(buffer, got);
         this .digest  =  end();
         return  digest;
    }

     /** */ /**
     * Get the digest, for this string digestifier. This method doesn't throw
     * any IOException, since it knows that the underlying stream ws built from
     * a String.
      */

     public   byte [] processString()  {
         if  ( ! stringp)
             throw   new  RuntimeException( this .getClass().getName()
                     +   " [processString] "   +   "  not a string. " );
         try   {
             return  getDigest();
        }   catch  (IOException ex)  {
        }
         throw   new  RuntimeException( this .getClass().getName()
                 +   " [processString] "   +   " : implementation error. " );
    }

     /** */ /**
     * Get the digest, as a proper string.
      */

     public  String getStringDigest()  {
         if  (digest  ==   null )
             throw   new  RuntimeException( this .getClass().getName()
                     +   " [getStringDigest] "   +   " : called before processing. " );
         return  stringify(digest);
    }

     /** */ /**
     * Construct a digestifier for the given string.
     *
     *  @param  input
     *            The string to be digestified.
     *  @param  encoding
     *            the encoding name used (such as UTF8)
      */

     public  MD5(String input, String enc)  {
         byte  bytes[]  =   null ;
         try   {
            bytes  =  input.getBytes(enc);
        }   catch  (UnsupportedEncodingException e)  {
             throw   new  RuntimeException( " no  "   +  enc  +   "  encoding!!! " );
        }
         this .stringp  =   true ;
         this .in  =   new  ByteArrayInputStream(bytes);
         this .state  =   new   int [ 4 ];
         this .buffer  =   new   byte [ 64 ];
         this .count  =   0 ;
        state[ 0 ]  =   0x67452301 ;
        state[ 1 ]  =   0xefcdab89 ;
        state[ 2 ]  =   0x98badcfe ;
        state[ 3 ]  =   0x10325476 ;
    }

     /** */ /**
     * Construct a digestifier for the given string.
     *
     *  @param  input
     *            The string to be digestified.
      */

     public  MD5(String input)  {
         this (input,  " UTF8 " );
    }

     /** */ /**
     * Construct a digestifier for the given input stream.
     *
     *  @param  in
     *            The input stream to be digestified.
      */

     public  MD5(InputStream in)  {
         this .stringp  =   false ;
         this .in  =  in;
         this .state  =   new   int [ 4 ];
         this .buffer  =   new   byte [ 64 ];
         this .count  =   0 ;
        state[ 0 ]  =   0x67452301 ;
        state[ 1 ]  =   0xefcdab89 ;
        state[ 2 ]  =   0x98badcfe ;
        state[ 3 ]  =   0x10325476 ;
    }

     public   static   void  main(String args[])  throws  IOException  {
         if  (args.length  !=   1 )  {
            System.out.println( " Md5  " );
            System.exit( 1 );
        }
        MD5 md5  =   new  MD5( new  FileInputStream( new  File(args[ 0 ])));
         byte  b[]  =  md5.getDigest();
        System.out.println(stringify(b));
    }

}

你可能感兴趣的:(Java生成UUID)