UUID通用唯一識别碼 學習筆記
Universally adv. 普遍地;人人;到處
Unique adj. 獨特的,稀罕的;[數] 唯一的,獨一無二的
Identifier n. 辨別符,認同者;檢驗人,鑒定人
UUID 是 通用唯一識别碼(Universally Unique Identifier)的縮寫,它使用某種規則,而不是某種中心化的自增方式,來保證這個識别碼的全局唯一性。UUID 有非常多的使用場景,比如在分布式系統中,需要生成全局唯一 ID 來進行日志記錄。UUID 的生成規則由 rfc4122 來進行定義。
版本
UUID具有多個版本,每個版本的算法不同,應用範圍也不同。首先是一個特例--Nil UUID--通常我們不會用到它,它是由全為0的數字組成:00000000-0000-0000-0000-000000000000
基于時間的UUID
基于時間的UUID通過計算目前時間戳、随機數和機器MAC位址得到。由于在算法中使用了MAC位址,這個版本的UUID可以保證在全球範圍的唯一性。但與此同時,使用MAC位址會帶來安全性問題,這就是這個版本UUID受到批評的地方。如果應用隻是在區域網路中使用,也可以使用退化的算法,以IP位址來代替MAC位址--Java的UUID往往是這樣實作的(當然也考慮了擷取MAC的難度)。
DCE安全的UUID
DCE(Distributed Computing Environment)安全的UUID和基于時間的UUID算法相同,但會把時間戳的前4位置換為POSIX的UID或GID。這個版本的UUID在實際中較少用到。
基于名字的UUID(MD5)
基于名字的UUID通過計算名字和名字空間的MD5散列值得到。這個版本的UUID保證了:相同名字空間中不同名字生成的UUID的唯一性;不同名字空間中的UUID的唯一性;相同名字空間中相同名字的UUID重複生成是相同的。
随機UUID
根據随機數,或者僞随機數生成UUID。這種UUID産生重複的機率是可以計算出來的,但随機的東西就像是買彩票:你指望它發财是不可能的。
基于名字的UUID(SHA1)
和基于名字的UUID算法類似,隻是散列值計算使用SHA1(Secure Hash Algorithm 1)算法。 [3]
編碼規則
UUID(Universally Unique Identifier)全局唯一辨別符,定義為一個字元串主鍵,采用32位數字組成,編碼采用16進制,定義了在時間和空間都完全惟一的系統資訊。
UUID的編碼規則:
1)1~8位采用系統時間,在系統時間上精确到毫秒級保證時間上的惟一性;
2)9~16位采用底層的IP位址,在伺服器叢集中的惟一性;
3)17~24位采用目前對象的HashCode值,在一個内部對象上的惟一性;
4)25~32位采用調用方法的一個随機數,在一個對象内的毫秒級的惟一性。
通過以上4種政策可以保證惟一性。在系統中需要用到随機數的地方都可以考慮采用UUID算法。
UUID Java生成
怎麼生成UUID ?
java.util包中有一個UUID類,可以直接生成
//得到32位的uuid
public static String getUUID32(){
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
怎麼生成指定個數 UUID ?
//得到指定數量的UUID,以數組的形式傳回
public static String[] getUUID(int num){
if( num <= 0)
return null;
String[] uuidArr = new String[num];
for (int i = 0; i < uuidArr.length; i++) {
uuidArr[i] = getUUID32();
}
return uuidArr;
}
//得到32位的uuid
public static String getUUID32(){
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}