雪花算法(04)機器信息



時間部分生成后,下一步是機器信息,占10位。我們這里把機器信息分成兩部分,一部分是數據中心id,占5位,一部分是機器id,占5位。這兩個id可以在部署項目的時候根據不同的機器自定義不同的id,這樣能人為的保障每個id都不同。比如: ```

/** 設置數據中心id為1 */

private static final long DATA_ID = 1L;

/** 設置機器id為2 */

private static final long WORK_ID = 2L;

<br/>
也可以根據自己機器的情況自動生成,不過有很小很小的風險會重復,這個風險碰到的幾率不大,當然如果能手動設置還是最好的。我們來說一下自己生成的情況。
<br/><br/><br/><br/>





我們的jdk庫中,有api可以獲取本地機器的hostname和hostaddress,我們來看一下:
<br/> <center> ![](https://img2018.cnblogs.com/blog/1765723/201908/1765723-20190814190626229-1915340261.png) </center> <br/>


我們來把hostname的信息作為數據中心id,把hostaddress的信息作為機器id,如何把兩個字符串改為兩個數字id呢?其實很簡單。獲取字符串的字節數組,然后把數組的每個數字相加,對節點數的最大值取余:
<br/> <center> ![](https://img2018.cnblogs.com/blog/1765723/201908/1765723-20190814190626423-2132064981.png) </center> <br/>


每個id的長度都是5,二進制中5個1的最大值就是31,所以數據id和機器id每個的最大值也是31,下面是獲取兩個id的方法:
<br/> <center> ![](https://img2018.cnblogs.com/blog/1765723/201908/1765723-20190814190626663-209382301.png) </center> <br/>


如果出現異常,返回一個隨機數,保證id的可靠性。下面可以定義兩個的id了:
<br/> <center> ![](https://img2018.cnblogs.com/blog/1765723/201908/1765723-20190814190626939-264861000.png) </center> <br/>
因為機器信息分成了兩部分分別生成的,所以,要分別位移,數據id要向左位移17位,機器id要向左位移12位。正好占據10位。

<br/><br/><br/><br/>





現在我們再來看下第二部分機器信息的限制,這兩個id每個的值都占五位,二進制的值從 00000  到11111,整數的范圍就是0-31之間共32個。那么雪花算法可以部署的機器數就是32*32=1024個,這是機器信息的限制,現在看這數字也是足足的夠了。注意如果自己給這兩個參數賦值,也要限制在31之內。
<br/><br/>




代碼地址:https://gitee.com/blueses/snowflake-demo  04
<br/>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM