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