前面的理論基礎(chǔ)和位運(yùn)算都了解了金句,下面我們來(lái)生成雪花算法的第一部分籍嘹,也就是時(shí)間部分方库。時(shí)間部分的邏輯起始很簡(jiǎn)單结序,就是規(guī)定一個(gè)起始時(shí)間戳,然后用當(dāng)前時(shí)間戳減去起始時(shí)間戳纵潦,這兩個(gè)數(shù)的差就是我們要的結(jié)果徐鹤。簡(jiǎn)單看一下代碼邏輯:
我們規(guī)定的起始時(shí)間是?2015-01-01 00:00:00 ,然后獲取當(dāng)前時(shí)間邀层,用當(dāng)前時(shí)間減去起始時(shí)間返敬,就是我們要的時(shí)間部分的數(shù)值。這個(gè)時(shí)候就有一個(gè)問(wèn)題了寥院,如果我們系統(tǒng)的時(shí)鐘錯(cuò)了會(huì)不會(huì)有問(wèn)題劲赠?會(huì)!所以要做判斷秸谢!而且系統(tǒng)的時(shí)鐘錯(cuò)誤也是雪花算法的一個(gè)致命問(wèn)題凛澎,所以要一定要保證服務(wù)器的系統(tǒng)時(shí)間正確。來(lái)看一下對(duì)時(shí)間戳的判斷:
定義了一個(gè)變量LAST_TIME_STAMP記為上次id的生成時(shí)間估蹄,每次生成都標(biāo)記一下塑煎,所以這個(gè)時(shí)間一定是遞增的,如果系統(tǒng)時(shí)鐘除了問(wèn)題臭蚁,那么直接報(bào)異常最铁。這是對(duì)系統(tǒng)時(shí)間錯(cuò)誤的一個(gè)判斷和處理。
就這樣時(shí)間部分就生成了垮兑,現(xiàn)在看看還是很簡(jiǎn)單的±湮荆現(xiàn)在我們?cè)賮?lái)看雪花算法的時(shí)間范圍,由于時(shí)間共占有41位系枪,所以時(shí)間的數(shù)字范圍是有一個(gè)最大值的雀哨,寫(xiě)成2進(jìn)制就是41個(gè)1,比如我們的起始時(shí)間是2015-01-01 00:00:00嗤无,時(shí)間戳是1420041600000L震束,把41個(gè)1轉(zhuǎn)換成long類型數(shù)字,再加上這個(gè)時(shí)間戳數(shù)字当犯,就是一個(gè)雪花算法最終的時(shí)間戳垢村,轉(zhuǎn)換成時(shí)間就是2084-09-06 15:47:35,也就是這個(gè)41位時(shí)間的雪花算法最長(zhǎng)使用69年9個(gè)月6天零15小時(shí)47分35秒嚎卫,不過(guò)對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō)嘉栓,這樣的限制不算限制宏榕,足足的夠用了。