UUID介紹:
UUID(Universally Unique Identifier)全局唯一標識符,是指在一台機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。按照開放軟件基金會(OSF)制定的標准計算,用到了以太網卡地址、納秒級時間、芯片ID碼和許多可能的數字。
由以下幾部分的組合:當前日期和時間(UUID的第一個部分與時間有關,如果你在生成一個UUID之后,過幾秒又生成一個UUID,則第一個部分不同,其余相同),時鍾序列,全局唯一的IEEE機器識別號(如果有網卡,從網卡獲得,沒有網卡以其他方式獲得),UUID的唯一缺陷在於生成的結果串會比較長。
UUID的特征:
經由一定的算法機器生成
為了保證UUID的唯一性,規范定義了包括網卡MAC地址、時間戳、名字空間(Namespace)、隨機或偽隨機數、時序等元素,以及從這些元素生成UUID的算法。UUID的復雜特性在保證了其唯一性的同時,意味着只能由計算機生成。
非人工指定,非人工識別
UUID是不能人工指定的,除非你冒着UUID重復的風險。UUID的復雜性決定了“一般人“不能直接從一個UUID知道哪個對象和它關聯。
在特定的范圍內重復的可能性極小
UUID的生成規范定義的算法主要目的就是要保證其唯一性。但這個唯一性是有限的,只在特定的范圍內才能得到保證,這和UUID的類型有關(參見UUID的版本)。
UUID的版本
UUID具有多個版本,每個版本的算法不同,應用范圍也不同。
首先是一個特例--Nil UUID--通常我們不會用到它,它是由全為0的數字組成,如下:
00000000-0000-0000-0000-000000000000
UUID Version 1:基於時間的UUID
基於時間的UUID通過計算當前時間戳、隨機數和機器MAC地址得到。由於在算法中使用了MAC地址,這個版本的UUID可以保證在全球范圍的唯一性。但與此同時,使用MAC地址會帶來安全性問題,這就是這個版本UUID受到批評的地方。如果應用只是在局域網中使用,也可以使用退化的算法,以IP地址來代替MAC地址--Java的UUID往往是這樣實現的(當然也考慮了獲取MAC的難度)。
UUID Version 2:DCE安全的UUID
分布式計算環境(Distributed Computing Environment)安全的UUID和基於時間的UUID算法相同,但會把時間戳的前4位置換為POSIX的UID或GID。這個版本的UUID在實際中較少用到。
UUID Version 3:基於名字的UUID(MD5)
基於名字的UUID通過計算名字和名字空間的MD5散列值得到。這個版本的UUID保證了:相同名字空間中不同名字生成的UUID的唯一性;不同名字空間中的UUID的唯一性;相同名字空間中相同名字的UUID重復生成是相同的。
UUID Version 4:隨機UUID
根據隨機數,或者偽隨機數生成UUID。這種UUID產生重復的概率是可以計算出來的,但隨機的東西就像是買彩票:你指望它發財是不可能的,但狗屎運通常會在不經意中到來。
UUID Version 5:基於名字的UUID(SHA1)
和版本3的UUID算法類似,只是散列值計算使用SHA1(Secure Hash Algorithm 1)算法。
UUID在推送中的應用
由於整個DDpush是基於UUID來工作的,DDpush認為一個UUID能唯一標識一個終端,不管其來源和任何特性。UUID是保持和識別在線終端的唯一方式,是推送的核心支撐,據了解,在具體項目中,UUID的生成后台是基於版本4(偽隨機數生成UUID)的,每個devicesId同時對應一個UUID。
