分布式唯一id(uuid,雪花算法對比)

UUID

UUID總長度 36,由 32 個 16 進制字符和 4 個連字符組成。連字符僅用于增加可讀性,實際的精度為一個 16 進制字符為 2^4=4bit,32 個則為 32*4bit=128bit。UUID具有多個版本,每個版本的算法不同,應用范圍也不同。首先是一個特例--Nil UUID--通常我們不會用到它,它是由全為0的數(shù)字組成,如下:00000000-0000-0000-0000-000000000000

  1. UUID Version 1:基于時間的UUID
    基于時間的UUID通過計算當前時間戳、隨機數(shù)和機器MAC地址得到。由于在算法中使用了MAC地址,這個版本的UUID可以保證在全球范圍的唯一性。但與此同時,使用MAC地址會帶來安全性問題,這就是這個版本UUID受到批評的地方。如果應用只是在局域網(wǎng)中使用,也可以使用退化的算法,以IP地址來代替MAC地址--Java的UUID往往是這樣實現(xiàn)的(當然也考慮了獲取MAC的難度)。
  2. UUID Version 2:DCE安全的UUID
    DCE(Distributed Computing Environment)安全的UUID和基于時間的UUID算法相同,但會把時間戳的前4位置換為POSIX的UID或GID。這個版本的UUID在實際中較少用到。
  3. UUID Version 3:基于名字的UUID(MD5)
    基于名字的UUID通過計算名字和名字空間的MD5散列值得到。這個版本的UUID保證了:相同名字空間中不同名字生成的UUID的唯一性;不同名字空間中的UUID的唯一性;相同名字空間中相同名字的UUID重復生成是相同的。
  4. UUID Version 4:隨機UUID
    根據(jù)隨機數(shù),或者偽隨機數(shù)生成UUID。這種UUID產(chǎn)生重復的概率是可以計算出來的,但隨機的東西就像是買彩票:你指望它發(fā)財是不可能的,但狗屎運通常會在不經(jīng)意中到來。
  5. UUID Version 5:基于名字的UUID(SHA1)
    和版本3的UUID算法類似,只是散列值計算使用SHA1(Secure Hash Algorithm 1)算法。
UUID的應用

從UUID的不同版本可以看出,
Version 1/2適合應用于分布式計算環(huán)境下,具有高度的唯一性;v1同一臺機器,不同服務之間會重復,v2同一臺機器可以通過不同的域名使不同服務也不會重復。
Version 3/5適合于一定范圍內(nèi)名字唯一,且需要或可能會重復生成UUID的環(huán)境下;使用v5替換v3碰撞概率更低。
Version 4,個人的建議是最好不用(雖然它是最簡單最方便的,隨機數(shù)重復,uuid就會重復)。

雪花算法

原始雪花算法會有時間回撥問題,業(yè)界有各種解決方案,以下是我的解決方案,雪花算法鏈接,時間回撥也不會產(chǎn)生重復id

總結(jié):

如果你想讓你的數(shù)據(jù)按照時間排序,或者想要分批遍歷大量數(shù)據(jù)的時候可以用雪花算法和自增id,如果是需要分布式則只能選擇雪花算法,uuid無法像自增id和雪花算法一樣按照時間排序和動態(tài)分批遍歷


參考鏈接
UUID是如何保證唯一性的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容