天天看點

UUID通用唯一識别碼 學習筆記UUID通用唯一識别碼 學習筆記

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();
}