1. 程式人生 > >Snowflake雪花演算法

Snowflake雪花演算法

分散式系統中,一些業務場景需要獲取全域性唯一ID,常用方法為:twitter的snowflake、UUID/GUID、mongodb的objectId。
【UUID】
1. 使用36位的UUID,jdk的util包中UUID類生成
2. 缺點:資料長,且無序

【snowflake】
1. 資料相對短,按時間有序
2. snowflake的結構如下(每部分用-分開):
0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
1. 第一位是標識,由於long基本型別在Java中是帶符號的,最高位是符號位,正數是0,負數是1,所以id一般是正數,最高位是0
2. 接下來的41位為毫秒級時間(41位的長度可以使用69年),注意,41位時間截不是儲存當前時間的時間截,而是儲存時間截的差值(當前時間截 - 開始時間截 得到的值),這裡的的開始時間截,一般是我們的id生成器開始使用的時間,由我們程式來指定的(如下下面程式IdWorker類的startTime屬性)。41位的時間截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
3. 然後是5位datacenterId和5位workerId(10位的長度最多支援部署1024個節點) 
4. 最後12位是毫秒內的計數。12位的計數順序號支援每個節點每毫秒(同一機器,同一時間截)產生4096個ID序號
一共加起來剛好64位,為一個Long型。(轉換成字串後長度最多19)
snowflake生成的ID整體上按照時間自增排序,並且整個分散式系統內不會產生ID碰撞(由datacenter和workerId作區分),並且效率較高。經測試snowflake每秒能夠產生26萬個ID。