Twitter分佈式ID生成算法解密

snowflake算法,是twitter開源的分佈式id生成算法!

核心思想

  • 使用一個64 bit的long型的數字做爲全局惟一id,這64個bit中,其中1個bit是不用的,而後用其中的41 bit做爲毫秒數,用10 bit做爲工做機器id,12 bit做爲序列號算法

    上面第一個部分,是1個bit:0,這個是無心義的分佈式

    上面第二個部分是41個bit:表示的是時間戳blog

    上面第三個部分是5個bit:表示的是機房id,10001部署

    上面第四個部分是5個bit:表示的是機器id,1 1001it

    上面第五個部分是12個bit:表示的序號,就是某個機房某臺機器上這一毫秒內同時生成的id的序號,0000 00000000二進制

  • 1 bit 是不用的,爲啥呢?由於二進制裏第一個bit爲若是是1,那麼都是負數,可是咱們生成的id都是正數,因此第一個bit統一都是0請求

  • 41 bit: 表示的是時間戳,單位是毫秒。41 bit能夠表示的數字多達2^41 - 1,也就是能夠標識2 ^ 41 - 1個毫秒值,換算成年就是表示69年的時間im

  • 10 bit:記錄工做機器id,表明的是這個服務最多能夠部署在2^10臺機器上,也就是1024臺機器時間戳

  • 12 bit:這個是用來記錄同一個毫秒內產生的不一樣id.12 bit能夠表明的最大正整數是2 ^ 12 - 1 = 4096,也就是說能夠用這個12bit表明的數字來區分同一個毫秒內的4096個不一樣的iddb

  • 簡單來講 你的某個服務假設要生成一個全局惟一id,那麼就能夠發送一個請求給部署了snowflake算法的系統,由這個snowflake算法系統來生成惟一id。 這個snowflake算法系統首先確定是知道本身所在的機房和機器的,好比機房id = 17,機器id = 12。 接着snowflake算法系統接收到這個請求以後,首先就會用二進制位運算的方式生成一個64 bit的long型id,64個bit中的第一個bit是無心義的。 接着41個bit,就能夠用當前時間戳(單位到毫秒),而後接着5個bit設置上這個機房id,還有5個bit設置上機器id。 最後再判斷一下,當前這臺機房的這臺機器上這一毫秒內,這是第幾個請求,給此次生成id的請求累加一個序號,做爲最後的12個bit 一個機房的一臺機器上,在同一毫秒內,生成了一個惟一的id。可能一個毫秒內會生成多個id,可是有最後12個bit的序號來區分開來

相關文章
相關標籤/搜索