雪花ID生成規則

一、雪花ID簡介

雪花ID是Twitter開源的分布式ID生成算法,採用信息耗盡式算法,生成的id不會重複,可以根據時間戳、機器id、序列號等信息生成64位的長整型ID。雪花ID是一個非常流行的分布式ID生成算法,其底層依賴於一個64位的long型變量,可以通過位運算等方式將long型變量表示成字符串形式的ID號,以此實現唯一ID的生成。

二、雪花ID組成部分

雪花ID組成的64位就是一個long型的數字,從二進制的角度來看,這個數字上有五部分構成:

  • 1.首位是符號位(1bit),生成的ID恆為正數,所以這個位的值始終是0。
  • 2.接下來的41位是時間戳, 表示生成的時間戳(毫秒級)。
  • 3.然後是5位數據中心標識ID和5位進程標識ID,表示在兩部分信息中的機器ID標識,15位的機器編號支持的節點數達到32768個機器節點。
  • 4.緊接着是10位序列號,表示同一機器同一毫秒內生成的不同ID序號,同時支持單機每毫秒的ID數達到1024個。

通過這樣的方式組裝成一個64位的long型變量。

三、雪花ID生成的可靠性

雪花ID是滿足以下需求的:

  • 1.全局唯一,時間戳(包括序列號)相同的id不會重複。
  • 2.趨勢遞增,因為採用時間戳作為生成信息,所以生成的ID越來越大。
  • 3.信息安全,序列號佔了10位,理論上每個時間戳里的序列號最大可以達到1024,如果超過了這個限制,程序會自旋等待下一個毫秒再生成ID。
  • 4.高可用,如果發生時鐘回撥,可以通過程序自旋等待後續時鐘進行補償。

四、雪花ID生成步驟

為了更好地理解雪花ID生成規則,我們可以將其步驟總結如下:

  1. 1.時間戳部分
  2. 
        long timestamp = System.currentTimeMillis();
        

    時間戳部分採用當前時間毫秒級別的時間戳,佔用41位。

  3. 2.數據中心、機器標識部分
  4. 
        long datacenterId = 1L;
        long machineId = 2L;
        

    數據中心和機器標識這兩部分都是採用配置的方式來實現,佔用10位。

  5. 3.序列號部分
  6. 
        long sequence = 0L;
        long lastTimestamp = -1L;
        while (true) {
            long nowTimestamp = System.currentTimeMillis();
            if (nowTimestamp < lastTimestamp) {
                throw new RuntimeException("雪花ID系統時鐘回退異常,請及時處理!");
            }
            if (nowTimestamp == lastTimestamp) {
                sequence = (sequence + 1) & maxSequence;
                if (sequence == 0) {
                    nowTimestamp = waitNextMillisecond(lastTimestamp);
                }
            } else {
                sequence = 0L;
            }
            lastTimestamp = nowTimestamp;
            return ((nowTimestamp - twepoch) << timestampShift) |
                    (datacenterId << datacenterIdShift) |
                    (machineId << machineIdShift) | sequence;
        }
        

    序列號部分採用循環累加的方式實現,可實現每毫秒1024個不同的序列號,佔用10位。

五、雪花ID生成總結

雪花ID是一種很好的分布式ID生成算法,其基於時間戳、機器ID、序列號等信息生成唯一的64位ID。同時,其在可靠性、趨勢遞增、信息安全以及高可用等方面表現出了極佳的效果,並且也有着較為簡潔易懂的生成規則。我們在實際項目中常常會使用到這種方式來生成唯一ID,哈哈,不過要注意時鐘回撥問題哦~

原創文章,作者:EFPN,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/150178.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EFPN的頭像EFPN
上一篇 2024-11-07 09:50
下一篇 2024-11-07 09:50

相關推薦

  • 解析URI編碼規則

    URI(統一資源標識符)是用來標識互聯網上資源的字符串文本標識符,是訪問互聯網資源的地址。在將URI傳送到服務器或瀏覽器時,需要進行特定編碼處理,這個編碼方式就是URI編碼規則。 …

    編程 2025-04-28
  • Python編寫規則用法介紹

    Python作為一種廣泛使用的高級編程語言,其編寫規則的規範性對於提高代碼可讀性、美觀度以及方便調試、維護至關重要。本文將從命名規則、注釋規則、代碼縮進等多個方面進行詳細的闡述,希…

    編程 2025-04-28
  • Python縮進規則用法介紹

    本文將從多個方面對Python的縮進規則進行詳細的闡述。 一、規則解答 Python中縮進是語法的一部分,它決定了程序的結構和邏輯。Python縮進規則要求同一層級的代碼必須保持相…

    編程 2025-04-28
  • Python實現雪花飄落

    本文將介紹如何使用Python實現雪花飄落的效果。我們將從以下四個方面進行闡述:雪花的繪製、雪花的動畫、屏幕的刷新和主函數的編寫。 一、雪花的繪製 我們可以使用Python的tur…

    編程 2025-04-27
  • 數據庫unique id insert全面解析

    數據庫unique id insert是指在數據庫中插入唯一的ID,無論是在哪個場景下,這都是非常關鍵的一步。在本文中,我們將從不同角度對該問題進行詳細的闡述,並給出相應的代碼示例…

    編程 2025-04-25
  • LL(1)語法分析器:從語法規則到語法樹

    在編譯原理中,語法分析是編譯器的一個重要階段。語法分析器的作用是將代碼轉換成語法樹,以便後續階段進行處理。LL(1)語法分析器是語法分析器的一種,它採用的是自頂向下的分析方法,可以…

    編程 2025-04-25
  • Jquery獲取ID詳解

    一、從jQuery中獲取ID的值 在前端開發中,獲取DOM的id值是一個非常常見的操作,jQuery為我們提供了非常方便的方法,通過$(“#id”)獲取就可…

    編程 2025-04-25
  • 蘋果ID管理中心

    一、蘋果ID管理中心官網 蘋果ID管理中心是用來管理您的蘋果賬戶的網站。您可以在該網站上更改個人信息,了解最新的蘋果產品以及在頭像下拉框中查看所有蘋果產品。蘋果ID管理中心官網地址…

    編程 2025-04-23
  • this.$route.params.id的詳細闡述

    this.$route.params.id是Vue.js框架的一部分,用於獲取路由傳遞過來的參數。在某些場景下,我們需要獲取傳遞過來的參數來進行判斷或處理。下面將從多個方面對thi…

    編程 2025-04-23
  • makefile編寫規則詳解

    一、目標、依賴和命令 makefile中最基本的幾個構成部分就是目標、依賴和命令。目標是我們要生成的文件,依賴是生成目標所需要的文件或者其他目標,命令則是生成目標的具體步驟。 ta…

    編程 2025-04-23

發表回復

登錄後才能評論