二: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在使用一*
*@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在使用二
可以采用一个开源实现: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个版本的算法)。