雪花演算法id的多方面闡述

一、概述

雪花演算法id是一個分散式可用的id生成器,也是現在廣泛應用的分散式情況下生成全局唯一id的解決方案之一,所以對雪花演算法id的深入了解十分有必要。

二、原理

雪花演算法id的原理是利用當前時間戳、工作機器id、序列號三個部分來生成全局唯一id。

1、時間戳

時間戳是雪花演算法id生成的第一部分,一般為41位,能夠使用的時長最長約69年,當前時間戳減去一個固定的時間點比如「2020-01-01」後右移22位即可獲得一個41位的時間戳。

2、工作機器id

工作機器id是一個在分散式系統中必須唯一的標識,一般為10位,5位表示數據中心id,5位表示機器id,能夠使用的最多數據中心id數量是32個,每個數據中心內部最多機器數量是32個。

3、序列號

序列號是每個工作機器id內部單調遞增的計數器,一般為12位,最多可以生成4096個id。序列號溢出後需要等到下一個毫秒進行生成。

三、代碼實現

public class SnowflakeIdGenerator {

    // 開始時間戳
    private static final long BEGIN_TIMESTAMP = 1577808000000L;

    // 數據中心id的位數
    private static final long DATA_CENTER_ID_BITS = 5L;

    // 機器id的位數
    private static final long MACHINE_ID_BITS = 5L;

    // 序列號的位數
    private static final long SEQUENCE_BITS = 12L;

    // 數據中心id最大值
    private static final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);

    // 機器id最大值
    private static final long MAX_MACHINE_ID = ~(-1L << MACHINE_ID_BITS);

    // 序列號最大值
    private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);

    // 數據中心id左移位數(機器id內部共享此位)
    private static final long DATA_CENTER_LEFT_SHIFT = SEQUENCE_BITS + MACHINE_ID_BITS;

    // 機器id左移位數
    private static final long MACHINE_LEFT_SHIFT = SEQUENCE_BITS;

    // 時間戳左移位數
    private static final long TIMESTAMP_LEFT_SHIFT = DATA_CENTER_LEFT_SHIFT + DATA_CENTER_ID_BITS;

    // 數據中心id
    private long dataCenterId;

    // 機器id
    private long machineId;

    // 序列號
    private long sequence;

    // 最後生成id的時間戳
    private long lastTimestamp = -1L;
    
    /**
     * 構造函數
     * @param dataCenterId 數據中心id
     * @param machineId 機器id
     */
    public SnowflakeIdGenerator(long dataCenterId, long machineId) {
        if (dataCenterId  MAX_DATA_CENTER_ID) {
            throw new IllegalArgumentException("data center id can't be greater than " + MAX_DATA_CENTER_ID + " or less than 0");
        }
        if (machineId  MAX_MACHINE_ID) {
            throw new IllegalArgumentException("machine id can't be greater than " + MAX_MACHINE_ID + " or less than 0");
        }
        this.dataCenterId = dataCenterId;
        this.machineId = machineId;
    }
    
    /**
     * 生成id方法
     * @return id
     */
    public synchronized long generateId() {
        long currentTimestamp = System.currentTimeMillis();
        if (currentTimestamp < lastTimestamp) {
            throw new RuntimeException("Clock moved backwards. Refusing to generate id");
        }
        if (currentTimestamp == lastTimestamp) {
            sequence = (sequence + 1) & MAX_SEQUENCE;
            if (sequence == 0) {
                currentTimestamp = waitUntilNextTime(lastTimestamp);
            }
        } else {
            sequence = 0;
        }
        lastTimestamp = currentTimestamp;
        return ((currentTimestamp - BEGIN_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT)
                | (dataCenterId << DATA_CENTER_LEFT_SHIFT)
                | (machineId << MACHINE_LEFT_SHIFT)
                | sequence;
    }
    
    /**
     * 等待下一毫秒
     * @param lastTimestamp 最後生成id的時間戳
     * @return 下一毫秒的時間戳
     */
    private long waitUntilNextTime(long lastTimestamp) {
        long time = System.currentTimeMillis();
        while (time <= lastTimestamp) {
            time = System.currentTimeMillis();
        }
        return time;
    }
}

四、使用場景

雪花演算法id適用於需要生成全局唯一id的場景,比如訂單號、用戶id等。在分散式場景下,也可以用於解決單個節點出現的並發問題。

五、總結

通過對雪花演算法id的深入介紹,相信大家對它有了更深入的了解。在開發過程中,如果需要生成全局唯一id,可以考慮使用雪花演算法id。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/239851.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:18
下一篇 2024-12-12 12:18

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群演算法Python的介紹和實現

    本文將介紹粒子群演算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群演算法的原理 粒子群演算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29
  • Python回歸演算法算例

    本文將從以下幾個方面對Python回歸演算法算例進行詳細闡述。 一、回歸演算法簡介 回歸演算法是數據分析中的一種重要方法,主要用於預測未來或進行趨勢分析,通過對歷史數據的學習和分析,建立…

    編程 2025-04-28
  • 象棋演算法思路探析

    本文將從多方面探討象棋演算法,包括搜索演算法、啟發式演算法、博弈樹演算法、神經網路演算法等。 一、搜索演算法 搜索演算法是一種常見的求解問題的方法。在象棋中,搜索演算法可以用來尋找最佳棋步。經典的…

    編程 2025-04-28

發表回復

登錄後才能評論