摘要:前面介紹了雪花算法的理論基礎(chǔ),可以對(duì)大概的算法有個(gè)了解,但是細(xì)節(jié)上可能還是模糊,下面來說一下雪花算法中用到的位運(yùn)算。這就是雪花算法中兩個(gè)位移操作的作用。
前面介紹了雪花算法的理論基礎(chǔ),可以對(duì)大概的算法有個(gè)了解,但是細(xì)節(jié)上可能還是模糊,下面來說一下雪花算法中用到的位運(yùn)算。這里先介紹兩個(gè),一個(gè)是:
<<
一個(gè)是
|
<<的作用是將數(shù)字向左移動(dòng),這里的數(shù)字指的是二進(jìn)制中的數(shù),并不是字面上的長(zhǎng)整型數(shù)字,當(dāng)然移動(dòng)后數(shù)字字面值肯定發(fā)生變化,但是這里對(duì)這個(gè)操作的主要理解要放在二進(jìn)制數(shù)字向左移動(dòng)上,而不是字面值擴(kuò)大2的n次方倍。
“|” 的作用是或運(yùn)算,兩個(gè)數(shù)對(duì)應(yīng)的位上只要有一個(gè)是1就是1,這樣的官方解釋不太明顯,放在雪花算法中的作用就是合并數(shù)字,下面會(huì)詳細(xì)演示。也就是說,三個(gè)需要生成的部分,分別由三個(gè)數(shù)來生成,然后利用 <<往左移動(dòng)到對(duì)應(yīng)的位置,最后將三個(gè)數(shù)字用 | 合并。這就是雪花算法中兩個(gè)位移操作的作用。
介紹一個(gè)例子比如有三個(gè)數(shù)字,分別打印出這三個(gè)數(shù)字的二進(jìn)制形式:
可以看到,5對(duì)應(yīng)的二進(jìn)制就是101,8對(duì)應(yīng)的2進(jìn)制就是1000,10對(duì)應(yīng)的二進(jìn)制就是1010。這三個(gè)數(shù)字轉(zhuǎn)換成二進(jìn)制后,所有的0和1自然還是在最右邊的末尾,下面就來進(jìn)行位移操作a向左移動(dòng)20位,b向左移動(dòng)10位,c不變:
通過a和b位移結(jié)果的前后對(duì)比,可以發(fā)現(xiàn)在二進(jìn)制的形式下,位移操作的意義淺顯易懂,就是把代表值的所有數(shù)字向左移動(dòng)了對(duì)應(yīng)的位數(shù)。我們把雪花算法生成的數(shù)字也分成了三部分,這三部分可以分別按照規(guī)則生成,然后用<<操作向左移動(dòng)對(duì)應(yīng)的位數(shù),就可以到達(dá)對(duì)應(yīng)的位置,最后再合并即可。
來看一下合并的代碼:
上面的“a|b|c”操作就是合并三個(gè)數(shù)字,怎么合并呢?就是多個(gè)64位的數(shù)字對(duì)應(yīng)的合在一起,在這64中,只要對(duì)應(yīng)位數(shù)上有一個(gè)位置是1,合并后這個(gè)位上的數(shù)字就是1,否則就是0,根據(jù)這個(gè)結(jié)果,我們看到數(shù)字d的二進(jìn)制形式確實(shí)包含了abc三個(gè)的所有數(shù)字。雖然最后的結(jié)果d是一個(gè)難以猜到的數(shù)字,但是我們進(jìn)行位運(yùn)算一定要看二進(jìn)制,不要看整數(shù)字面值,這三個(gè)數(shù)字放在了各自對(duì)應(yīng)的位數(shù)范圍內(nèi),只要三個(gè)數(shù)字的范圍不越界,也就是說a永遠(yuǎn)在從右向左20位以后,b永遠(yuǎn)在10到20之間,c永遠(yuǎn)在0到10之間,那么這三個(gè)數(shù)字就可以各管各的,并且結(jié)果是合法合理的。
當(dāng)然這種操作也是有底線的,比如b,他的數(shù)字大小轉(zhuǎn)換成2進(jìn)制后如果長(zhǎng)度比10位大,那么它就會(huì)和a互相影響,導(dǎo)致結(jié)果不可預(yù)料,這就是范圍的由來。我們?cè)賮砜紤]一下雪花算法,除了第一位0之外,第一部分是時(shí)間部分,占41位,也就是說生成的時(shí)間數(shù)字要向左移動(dòng)(64-1-41=)22位,第二部分是機(jī)器信息,占10位,也即是說代表機(jī)器信息的數(shù)字生成后要向左移動(dòng)(64-1-41-10=)12位,當(dāng)然第三部分在末尾,就不用位移了。這三部分計(jì)算出來并且向左位移完成后,直接用“|”運(yùn)算合成即可,就是我們最終要的分布式唯一id。
代碼地址:https://gitee.com/blueses/sno... 02
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76142.html
摘要:雪花算法生成的最終結(jié)果其實(shí)就是一個(gè)類型的長(zhǎng)整型數(shù)字,這是一個(gè)大前提算法所有的內(nèi)容都是針對(duì)這個(gè)數(shù)字進(jìn)行運(yùn)算的。根據(jù)上面的理論可以開始學(xué)習(xí)雪花算法。 針對(duì)每個(gè)公司,隨著服務(wù)化演進(jìn),單個(gè)服務(wù)越來越多,數(shù)據(jù)庫分的越來越細(xì),有的時(shí)候一個(gè)業(yè)務(wù)需要分成好幾個(gè)庫,這時(shí)候自增主鍵或者序列之類的主鍵id生成方式已經(jīng)不再滿足需求,分布式系統(tǒng)中需要的是一個(gè)全局唯一的id生成規(guī)則。既然號(hào)稱在全局分布式系統(tǒng)中唯一...
摘要:雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。 雪花算法初步完成后,我們討論了幾個(gè)位運(yùn)算的寫法,大家知道雪花算法一旦確定后,很多數(shù)字都是定死的,比如機(jī)器占多少位,或者時(shí)間向左位移多少,這些在算法具體邏輯確定后就不會(huì)變了。那么寫成最后的數(shù)字和用位運(yùn)算計(jì)算出來有什么...
摘要:位二進(jìn)制表示的最大值雪花算法已經(jīng)初步完成了?,F(xiàn)在我們?cè)賮砜磶讉€(gè)位操作。前面我們說過兩個(gè)位移操作,那兩個(gè)我們主要是關(guān)注二進(jìn)制形式的數(shù)字效果,這里我們就要看字面值的變化了。 n位二進(jìn)制表示的最大值 雪花算法已經(jīng)初步完成了?,F(xiàn)在我們?cè)賮砜磶讉€(gè)位操作。先看第一個(gè),還是左移操作,不過這里演示負(fù)數(shù)左移:
摘要:前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來生成雪花算法的第一部分,也就是時(shí)間部分。這個(gè)時(shí)候就有一個(gè)問題了,如果我們系統(tǒng)的時(shí)鐘錯(cuò)了會(huì)不會(huì)有問題會(huì)所以要做判斷而且系統(tǒng)的時(shí)鐘錯(cuò)誤也是雪花算法的一個(gè)致命問題,所以要一定要保證服務(wù)器的系統(tǒng)時(shí)間正確。 前面的理論基礎(chǔ)和位運(yùn)算都了解了,下面我們來生成雪花算法的第一部分,也就是時(shí)間部分。時(shí)間部分的邏輯起始很簡(jiǎn)單,就是規(guī)定一個(gè)起始時(shí)間戳,然后用當(dāng)前時(shí)間戳...
摘要:雖然在內(nèi)部,數(shù)值都是以位浮點(diǎn)數(shù)的形式儲(chǔ)存,但是做位運(yùn)算的時(shí)候,是以位帶符號(hào)的整數(shù)進(jìn)行運(yùn)算的,并且返回值也是一個(gè)位帶符號(hào)的整數(shù)。如下表應(yīng)用場(chǎng)景取整對(duì)于一般的整數(shù),返回值不會(huì)有任何變化。例如,結(jié)果為負(fù)數(shù)存儲(chǔ)采用的形式是二進(jìn)制補(bǔ)碼。 什么是位運(yùn)算? 位運(yùn)算是在數(shù)字底層(即表示數(shù)字的 32 個(gè)數(shù)位)進(jìn)行運(yùn)算的。由于位運(yùn)算是低級(jí)的運(yùn)算操作,所以速度往往也是最快的(相對(duì)其它運(yùn)算如加減乘除來說),并...
閱讀 3410·2021-09-22 15:01
閱讀 535·2019-08-30 11:11
閱讀 965·2019-08-29 16:17
閱讀 1218·2019-08-29 12:23
閱讀 2036·2019-08-26 11:48
閱讀 3189·2019-08-26 11:48
閱讀 1427·2019-08-26 10:33
閱讀 1938·2019-08-26 10:30