一.UUID的介绍:UUID又称为通用唯一标识符,是一个128位长的数字,一般用16进制表示,算法的核心思想是结合机器的网卡、当前时间和一个随机数来生成UUID.
二:UUID的形式是:4-2-2-2-6,共4+2+2+2+6=16个字节。比如,550e8400-e29b-41d4-a716-446655440000 。其中,第3部分的第一个字节(即总体上的第7个字节)的高4位用来表示uuid的version类型。version表明了uuid的算法版本,目前有如下几种:
1,version1:version1是第一次提出来的算法,算法使用了唯一硬件地址(比如,网卡啊,cpu编号啊)+精确到100纳秒的时间,还有其他的一些数据来产生结果。可是,它被广泛的抵制了,因为根据uuid可以很容易的查到是那台电脑构建的(因为网卡地址唯一)。传闻说有一次网络攻击行为就是被这种方式给追踪到黑客的。
2,version3:第3版本的算法(很奇怪的是居然没有第2版本的算法),这个算法十分简单,就是使用md5算法hash一个唯一url地址。保证uuid的唯一需要你自己保证url地址的唯一。
3,version4:第4版本的算法,这个算法也很容易理解,它是直接使用一个随机数来构建uuid。随机数如何构建由自己决定。
4,version5:第5版本的算法,这个算法和第3版本的算法几乎一样,唯一不同的是它使用了sha-1算法代替md5算法来进行hash。
三:UUID在使用一
/**
     * 
     * 
@author wangdei
     * 在 
http://www.bt285.cn BT下载
     * 
http://www.5a520.cn 小说520 上使用. 
     *
     
*/

    
public class RandomGUID extends Object {
        
protected final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory
           .getLog(getClass());

        
public String valueBeforeMD5 = "";
        
public String valueAfterMD5 = "";
        
private static Random myRand;
        
private static SecureRandom mySecureRand;

        
private static String s_id;
        
private static final int PAD_BELOW = 0x10;
        
private static final int TWO_BYTES = 0xFF;

        
/*
         * Static block to take care of one time secureRandom seed.
         * It takes a few seconds to initialize SecureRandom.   You might
         * want to consider removing this static block or replacing
         * it with a "time since first loaded" seed to reduce this time.
         * This block will run only once per JVM instance.
           
*/


        
static {
           mySecureRand 
= new SecureRandom();
           
long secureInitializer = mySecureRand.nextLong();
           myRand 
= new Random(secureInitializer);
           
try {
              s_id 
= InetAddress.getLocalHost().toString();
           }
 catch (UnknownHostException e) {
              e.printStackTrace();
           }


        }



        
/*
         * Default constructor.   With no specification of security option,
         * this constructor defaults to lower security, high performance.
         
*/

        
public RandomGUID() {
           getRandomGUID(
false);
        }


        
/*
         * Constructor with security option.   Setting secure true
         * enables each random number generated to be cryptographically
         * strong.   Secure false defaults to the standard Random function seeded
         * with a single cryptographically strong random number.
         
*/

        
public RandomGUID(boolean secure) {
           getRandomGUID(secure);
        }


        
/*
         * Method to generate the random GUID
         
*/

        
private void getRandomGUID(boolean secure) {
           MessageDigest md5 
= null;
           StringBuffer sbValueBeforeMD5 
= new StringBuffer(128);

           
try {
              md5 
= MessageDigest.getInstance("MD5");
           }
 catch (NoSuchAlgorithmException e) {
              logger.error(
"Error: " + e);
           }


           
try {
              
long time = System.currentTimeMillis();
              
long rand = 0;

              
if (secure) {
                 rand 
= mySecureRand.nextLong();
              }
 else {
                 rand 
= myRand.nextLong();
              }

              sbValueBeforeMD5.append(s_id);
              sbValueBeforeMD5.append(
":");
              sbValueBeforeMD5.append(Long.toString(time));
              sbValueBeforeMD5.append(
":");
              sbValueBeforeMD5.append(Long.toString(rand));

              valueBeforeMD5 
= sbValueBeforeMD5.toString();
              md5.update(valueBeforeMD5.getBytes());

              
byte[] array = md5.digest();
              StringBuffer sb 
= new StringBuffer(32);
              
for (int j = 0; j < array.length; ++j) {
                 
int b = array[j] & TWO_BYTES;
                 
if (b < PAD_BELOW)
                    sb.append(
'0');
                 sb.append(Integer.toHexString(b));
              }


              valueAfterMD5 
= sb.toString();

           }
 catch (Exception e) {
              logger.error(
"Error:" + e);
           }

        }


        
/*
         * Convert to the standard format for GUID
         * (Useful for SQL Server UniqueIdentifiers, etc.)
         * Example: C2FEEEAC-CFCD-11D1-8B05-00600806D9B6
         
*/

        
public String toString() {
           String raw 
= valueAfterMD5.toUpperCase();
           StringBuffer sb 
= new StringBuffer(64);
           sb.append(raw.substring(
08));
           sb.append(
"-");
           sb.append(raw.substring(
812));
           sb.append(
"-");
           sb.append(raw.substring(
1216));
           sb.append(
"-");
           sb.append(raw.substring(
1620));
           sb.append(
"-");
           sb.append(raw.substring(
20));

           
return sb.toString();
        }



          
// Demonstraton and self test of class
          public static void main(String args[]) {
            
for (int i=0; i< 100; i++{
              RandomGUID myGUID 
= new RandomGUID();
              System.out.println(
"Seeding String=" + myGUID.valueBeforeMD5);
              System.out.println(
"rawGUID=" + myGUID.valueAfterMD5);
              System.out.println(
"RandomGUID=" + myGUID.toString());
            }

          }



    }

四:UUID在使用二
可以采用一个开源实现:http://jug.safehaus.org/ 或者用jakarta commons下的http://jakarta.apache.org/commons/sandbox/id/
五:UUID在使用三
Java1.5中,已经包含了一个UUID的实现java.util.UUID。要随机生成一个UUID,只要用两行代码就可以了:String uuid = UUID.randomUUID().toString(); 目前UUID类只提供了根据md5和根据随机数来构建uuid的算法(即第3和第4个版本的算法)。