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