一.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在使用一
UUID的介绍与使用UUID的介绍与使用/** *//**

*

*@authorwangdei

*在http://www.bt285.cnBT下载

*http://www.5a520.cn小说520上使用.

*

*/

publicclassRandomGUIDextendsObject{

protectedfinalorg.apache.commons.logging.Loglogger=org.apache.commons.logging.LogFactory

.getLog(getClass());

publicStringvalueBeforeMD5="";

publicStringvalueAfterMD5="";

privatestaticRandommyRand;

privatestaticSecureRandommySecureRand;

privatestaticStrings_id;

privatestaticfinalintPAD_BELOW=0x10;

privatestaticfinalintTWO_BYTES=0xFF;

/**//*

*StaticblocktotakecareofonetimesecureRandomseed.

*IttakesafewsecondstoinitializeSecureRandom.Youmight

*wanttoconsiderremovingthisstaticblockorreplacing

*itwitha"timesincefirstloaded"seedtoreducethistime.

*ThisblockwillrunonlyonceperJVMinstance.

*/

static{

mySecureRand=newSecureRandom();

longsecureInitializer=mySecureRand.nextLong();

myRand=newRandom(secureInitializer);

try{

s_id=InetAddress.getLocalHost().toString();

}catch(UnknownHostExceptione){

e.printStackTrace();

}

}

/**//*

*Defaultconstructor.Withnospecificationofsecurityoption,

*thisconstructordefaultstolowersecurity,highperformance.

*/

publicRandomGUID(){

getRandomGUID(false);

}

/**//*

*Constructorwithsecurityoption.Settingsecuretrue

*enableseachrandomnumbergeneratedtobecryptographically

*strong.SecurefalsedefaultstothestandardRandomfunctionseeded

*withasinglecryptographicallystrongrandomnumber.

*/

publicRandomGUID(booleansecure){

getRandomGUID(secure);

}

/**//*

*MethodtogeneratetherandomGUID

*/

privatevoidgetRandomGUID(booleansecure){

MessageDigestmd5=null;

StringBuffersbValueBeforeMD5=newStringBuffer(128);

try{

md5=MessageDigest.getInstance("MD5");

}catch(NoSuchAlgorithmExceptione){

logger.error("Error:"+e);

}

try{

longtime=System.currentTimeMillis();

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

StringBuffersb=newStringBuffer(32);

for(intj=0;j<array.length;++j){

intb=array[j]&TWO_BYTES;

if(b<PAD_BELOW)

sb.append('0');

sb.append(Integer.toHexString(b));

}

valueAfterMD5=sb.toString();

}catch(Exceptione){

logger.error("Error:"+e);

}

}

/**//*

*ConverttothestandardformatforGUID

*(UsefulforSQLServerUniqueIdentifiers,etc.)

*Example:C2FEEEAC-CFCD-11D1-8B05-00600806D9B6

*/

publicStringtoString(){

Stringraw=valueAfterMD5.toUpperCase();

StringBuffersb=newStringBuffer(64);

sb.append(raw.substring(0,8));

sb.append("-");

sb.append(raw.substring(8,12));

sb.append("-");

sb.append(raw.substring(12,16));

sb.append("-");

sb.append(raw.substring(16,20));

sb.append("-");

sb.append(raw.substring(20));

returnsb.toString();

}

//Demonstratonandselftestofclass

publicstaticvoidmain(Stringargs[]){

for(inti=0;i<100;i++){

RandomGUIDmyGUID=newRandomGUID();

System.out.println("SeedingString="+myGUID.valueBeforeMD5);

System.out.println("rawGUid="+myGUID.valueAfterMD5);

System.out.println("RandomGUid="+myGUID.toString());

}

}

UUID的介绍与使用    }

四:UUID在使用二

可以采用一个开源实现:http://jug.safehaus.org/或者用jakartacommons下的http://jakarta.apache.org/commons/sandbox/id/

五:UUID在使用三

在Java1.5中,已经包含了一个UUID的实现java.util.UUID。要随机生成一个UUID,只要用两行代码就可以了:Stringuuid=UUID.randomUUID().toString();目前UUID类只提供了根据md5和根据随机数来构建uuid的算法(即第3和第4个版本的算法)。