本文打印版下載地址
1、UUID的定義
UUID是通用唯一識別碼(Universally Unique Identifier)的縮寫,是一種軟件建構的標准,是開放軟件基金會組織在分布式計算環境領域的一部分。其目的是讓分布式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。
UUID用來識別屬性類型,在所有空間和時間上被視為唯一的標識,任何地方產生的任意一個UUID都不會有相同的值。UUID的唯一缺陷在於生成的結果串會比較長,是一個128比特的數值。
目前最廣泛應用的 UUID,即是微軟的 Microsoft's Globally Unique Identifiers (GUIDs),而其他重要的應用,則有 Linux ext2/ext3 檔案系統、LUKS 加密分割區、GNOME、KDE、Mac OS X 等等。
2、UUID的組成
UUID基於當前時間、計數器(counter)和硬件標識(通常為無線網卡的MAC地址)等數據計算生成。
(1)當前日期和時間:UUID的第一個部分與時間有關。
(2)時鍾序列。
(3)全局唯一的IEEE機器識別號:如果有網卡,從網卡MAC地址獲得,沒有網卡以其他方式獲得。
(4)Java Hibernate中:采用IP-JVM啟動時間-當前時間右移32位-當前時間-內部計數(8-8-4-8-4)來組成UUID。
3、UUID的編碼規則
UUID全局唯一標識符定義為一個字符串主鍵,采用32位數字組成,編碼采用16進制,定義了在時間和空間都完全惟一的系統信息。
(1)1-8位采用系統時間,在系統時間上精確到毫秒級保證時間上的惟一性;
(2)9-16位采用底層的IP地址,在服務器集群中的惟一性;
(3)17-24位采用當前對象的HashCode值,在一個內部對象上的惟一性;
(4)25-32位采用調用方法的一個隨機數,在一個對象內的毫秒級的惟一性。
4、UUID的版本
UUID具有多個版本,每個版本的算法不同,應用范圍也不同。
(1)特例Nil UUID:通常用不到,由全為0的數字組成:00000000-0000-0000-0000-000000000000。
(2)基於時間的UUID
-
① 基於時間的UUID通過計算當前時間戳、隨機數和機器MAC地址得到。
-
② 在算法中使用了MAC地址,保證了UUID在全球范圍的唯一性,但會帶來安全性問題。
-
③ 使用退化的算法,以IP地址來代替MAC地址--Java的UUID這樣實現的。
(3)DCE安全的UUID(Distributed Computing Environment)
DCE安全的UUID和基於時間的UUID算法相同,但會把時間戳的前4位置換為POSIX的UID或GID。這個版本的UUID在實際中較少用到。
(4)基於名字的UUID
-
① 基於名字的UUID(MD5):通過計算名字和名字空間的MD5散列值得到。
-
② 基於名字的UUID(SHA1):通過計算名字和名字空間的SHA1散列值得到。
-
③ 基於名字的UUID保證了UUID的唯一性:
-
❶ 相同名字空間中不同名字生成的UUID的唯一性;
-
❷ 不同名字空間中的UUID的唯一性;
-
❸ 相同名字空間中相同名字的UUID重復生成是相同的。
-
(5)隨機UUID:根據隨機數,或者偽隨機數生成UUID,這種UUID產生重復的概率是可以計算出來的。
參考資料: 《百度百科-UUID》
免責聲明:本文是對《百度百科-UUID》的個人學習總結,屬於個人的學習筆記,僅用於學習和分享交流,不涉及商業用途。如果本文發布的內容侵犯到相關的權益,請及時聯系本人進行刪除!