Snowflake,雪花算法是由Twitter開源的分布式ID生成算法,以劃分命名空間的方式將 64-bit位分割成多個部分,每個部分代表不同的含義。而 Java中64bit的整數(shù)是Long類型,所以在 Java 中 SnowFlake 算法生成的 ID 就是 long 來存儲的。
第1位占用1bit,其值始終是0,可看做是符號位不使用。
第2位開始的41位是時間戳,41-bit位可表示2^41個數(shù),每個數(shù)代表毫秒,那么雪花算法可用的時間年限是(1L<<41)/(1000L360024*365)=69 年的時間。
中間的10-bit位可表示機器數(shù),即2^10 = 1024臺機器,但是一般情況下我們不會部署這么臺機器。如果我們對IDC(互聯(lián)網(wǎng)數(shù)據(jù)中心)有需求,還可以將 10-bit 分 5-bit 給 IDC,分5-bit給工作機器。這樣就可以表示32個IDC,每個IDC下可以有32臺機器,具體的劃分可以根據(jù)自身需求定義。
最后12-bit位是自增序列,可表示2^12 = 4096個數(shù)。
這樣的劃分之后相當于在一毫秒一個數(shù)據(jù)中心的一臺機器上可產(chǎn)生4096個有序的不重復的ID。但是我們 IDC 和機器數(shù)肯定不止一個,所以毫秒內(nèi)能生成的有序ID數(shù)是翻倍的。