Java中如何使用雪花算法生成唯一ID

雪花算法(Snowflake ID)是 Twitter 開源的一種分布式 ID 生成算法,其目的是生成全局唯一的 ID。該算法的核心思想是將一個 64 位的二進制數字分成幾個部分,每個部分表示不同的信息,例如數據中心ID、機器ID、序列號等。這些部分的取值范圍可以根據實際情況進行調整。

使用雪花算法生成的 ID 具有以下特點:

  1. 全局唯一,ID 不會重復。
  2. 按時間有序,新生成的 ID 比舊的 ID 大。
  3. 可以在分布式環境下生成,不需要中心節點協調。
  4. 高性能,生成 ID 的速度快。

因其具有全局唯一和分布式特性,常被用于互聯網應用的分布式系統中,如訂單號生成、數據庫主鍵生成等。

具體實現代碼如下:

public class Snowflake {/** 開始時間戳 (2021-01-01) */private final long START_TIMESTAMP = 1609430400000L;/** 機器ID所占的位數 */private final long WORKER_ID_BITS = 5L;/** 數據標識ID所占的位數 */private final long DATA_CENTER_ID_BITS = 5L;/** 支持的最大機器ID,結果是31 (0B11111) */private final long MAX_WORKER_ID = ~(-1L << WORKER_ID_BITS);/** 支持的最大數據標識ID,結果是31 (0B11111) */private final long MAX_DATA_CENTER_ID = ~(-1L << DATA_CENTER_ID_BITS);/** 序列在ID中占的位數 */private final long SEQUENCE_BITS = 12L;/** 機器ID向左移12位 */private final long WORKER_ID_SHIFT = SEQUENCE_BITS;/** 數據標識ID向左移17位(12+5) */private final long DATA_CENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS;/** 時間戳向左移22位(5+5+12) */private final long TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATA_CENTER_ID_BITS;/** 支持的最大序列號,結果是4095 (0B111111111111) */private final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS);/** 工作機器ID */private final long workerId;/** 數據中心ID */private final long dataCenterId;/** 毫秒內序列號 */private long sequence = 0L;/** 上次生成ID的時間戳 */private long lastTimestamp = -1L;/*** 構造函數* @param workerId 工作機器ID* @param dataCenterId 數據中心ID*/public Snowflake(long workerId, long dataCenterId) {if (workerId > MAX_WORKER_ID || workerId < 0) {throw new IllegalArgumentException(String.format("WorkerID不能超過%d且不能小于0", MAX_WORKER_ID));}if (dataCenterId > MAX_DATA_CENTER_ID || dataCenterId < 0) {throw new IllegalArgumentException(String.format("DataCenterID不能超過%d且不能小于0", MAX_DATA_CENTER_ID));}this.workerId = workerId;this.dataCenterId = dataCenterId;}/*** 生成ID* @return long類型的ID*/public synchronized long nextId() {long timestamp = System.currentTimeMillis();// 如果當前時間小于上次生成ID的時間戳,說明系統時鐘回退過,拋出異常if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("系統時鐘回退,拒絕生成ID,上次生成ID的時間戳:%d,當前時間戳:%d",lastTimestamp, timestamp));}// 如果當前時間等于上次生成ID的時間戳(同一毫秒內),則序列號加1if (timestamp == lastTimestamp) {sequence = (sequence + 1) & MAX_SEQUENCE;if (sequence == 0) {// 如果序列號已經超過最大值,需要等待到下一毫秒再繼續生成IDtimestamp = waitNextMillis(timestamp);}} else {sequence = 0L;}// 更新上次生成ID的時間戳lastTimestamp = timestamp;// 生成IDreturn ((timestamp - START_TIMESTAMP) << TIMESTAMP_LEFT_SHIFT) |(dataCenterId << DATA_CENTER_ID_SHIFT) |(workerId << WORKER_ID_SHIFT) |sequence;}/*** 等待下一毫秒* @param timestamp 上次生成ID的時間戳* @return 下一毫秒的時間戳*/private long waitNextMillis(long timestamp) {long nextTimestamp = System.currentTimeMillis();while (nextTimestamp <= timestamp) {nextTimestamp = System.currentTimeMillis();}return nextTimestamp;}// 示例public static void main(String[] args) {Snowflake snowflake = new Snowflake(1, 1);System.out.println(snowflake.nextId());}
}

在上述代碼中,可以通過調整START_TIMESTAMP、WORKER_ID_BITS、DATA_CENTER_ID_BITS、SEQUENCE_BITS等參數來滿足不同的需求,例如支持更多的機器、更高的QPS等。

這是批量生成的ID:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160139.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BUUCTF 梅花香之苦寒來 1

BUUCTF:https://buuoj.cn/challenges 題目描述&#xff1a; 注意&#xff1a;得到的 flag 請包上 flag{} 提交 密文&#xff1a; 下載附件&#xff0c;解壓得到一張.jpg圖片。 解題思路&#xff1a; 1、用010 Editor看了一下&#xff0c;剛開始以為是修改寬高的題&#xff…

羊大師教你如何有效解決工作中的挑戰與壓力?

在現代社會&#xff0c;工作問題一直是許多人頭疼的難題。無論是從工作壓力到職業發展&#xff0c;工作問題不僅會影響個人的心理健康&#xff0c;還可能對整個工作團隊的效率和和諧產生負面影響。因此&#xff0c;如何有效解決工作問題成為了每個職場人士都需要面對的挑戰。 …

Web前端—移動Web第四天(vw適配方案、vw和vh的基本使用、綜合案例-酷我音樂)

版本說明 當前版本號[20231122]。 版本修改說明20231122初版 目錄 文章目錄 版本說明目錄移動 Web 第四天01-vw適配方案vw和vh基本使用vw布局vh布局混用問題 02-綜合案例-酷我音樂準備工作頭部布局頭部內容搜索區域banner 區域標題公共樣式排行榜內容推薦歌單布局推薦歌單內…

Cuda out of memory原因以及解決辦法

Cuda out of memory原因以及解決辦法 文章目錄 Cuda out of memory原因以及解決辦法batch_size設置過大 batch_size設置過大 最近在做對抗訓練方面的實驗&#xff0c;當batch_size設置為256的時候&#xff0c;出現cuda out of memory. 當將batch_size修改為128時&#xff0c;則…

mysql使用--連接查詢

1.連接查詢 如&#xff1a;SELECT * FROM t1, t2; 上述FROM語句將t1表&#xff0c;t2表連接。 假設t1表含n條記錄&#xff0c;t2表含m條記錄&#xff0c;則t1, t2得到的表將包含n*m條記錄。 我們以一個混合連接&#xff0c;過濾的查詢分析語句執行過程。 如&#xff1a;SELECT…

thinkphp文件夾生成zip壓縮包

一、準備工作&#xff0c;使用phpinfo()查看有沒有zip擴展 <?php echo phpinfo(); ?>Thinkphp使用PHP自帶的ZipArchive壓縮文件或文件夾 顯示enabled 說明已經配置好 如果沒有安裝擴展的&#xff0c;請參照以下方法&#xff1a; 1、下載對應版本的擴展包&#xff1a…

Java操作excel之poi

1. 創建Excel 1.1 創建新Excel工作簿 引入poi依賴 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar…

QTableView 和 QAbstractTableModel

1.自定義類繼承QAbstractTableModel 頭文件如下&#xff1a; #ifndef TESTMOUDLE_H #define TESTMOUDLE_H #include "StructTest.h" #include <QAbstractTableModel> class TestMoudle : public QAbstractTableModel { public: TestMoudle(QStringList&…

如何一次性解壓多個文件

第一步&#xff1a;多選壓縮包 第二步&#xff1a;右鍵解壓即可 一句話&#xff0c;單個怎么解壓&#xff0c;多個就怎么解壓&#xff0c;只不過先選中 參考&#xff1a;如何一次性解壓多個文件

智能安全帽作業記錄儀賦能智慧工地人臉識別勞務實名制

需求背景 建筑工地是一個安全事故多發的場所。目前&#xff0c;工程建設規模不斷擴大&#xff0c;工藝流程紛繁復雜&#xff0c;如何完善現場施工現場管理&#xff0c;控制事故發生頻率&#xff0c;保障文明施工一直是施工企業、政府管理部門關注的焦點。尤其隨著社會的不斷進…

YARN,ZOOKEERPER--學習筆記

1&#xff0c;YARN組件 1.1YARN簡介 YARN表示分布式資源調度&#xff0c;簡單地說&#xff0c;就是&#xff1a;以分布式技術完成資源的合理分配&#xff0c;讓MapReduce能高效完成計算任務。 YARN是Hadoop核心組件之一&#xff0c;用于提供分布式資源調度服務。 而在Hadoop …

邏輯漏洞(業務邏輯)dami CMS

邏輯漏洞&#xff08;業務支付邏輯漏洞&#xff09;dami CMS 0x01 業務邏輯簡介 業務邏輯指的是一個系統或應用程序中的實際業務規則和流程。它描述了如何處理特定的業務需求、數據和操作。業務邏輯通常是根據特定行業或組織的需求而設計的。 在軟件開發中&#xff0c;業務邏…

零編程基礎Python的全面學習指南

文章目錄 前言什么是編程&#xff1f;Python代碼對應的機器碼準備開始Windows變量類型整型字符串型布爾類型字符串連接和整數相加if 語句捕獲用戶輸入導入MacWindows游戲時間&#xff01;小結關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Pyt…

磐舟CI使用說明及案例

整體介紹 磐舟作為一個devops產品&#xff0c;它具備基礎的CI流水線功能。同時磐舟的流水線是完全基于云原生架構設計的&#xff0c;在使用時會有一些注意事項。這里首先我們要了解磐舟整體的流水線打包邏輯。 文檔結構說明 一般來說&#xff0c;磐舟推薦單個業務的標準git庫…

反編譯-ApkTool

ApkTool下載地址&#xff1a; Apktool | ApktoolA tool for reverse engineering Android apk fileshttps://apktool.org/ 1、使用 apktool 解包 執行 java -jar apktool_2.4.1.jar d demo.apk -o demo 命令 java -jar apktool_2.4.1.jar d demo.apk -o demo 其中 d 后面是…

Nevron Vision for .NET 2023.1 Crack

Nevron Vision for .NET 適用于桌面和 Web 應用程序的高級數據可視化 Nevron Vision for .NET提供最全面的組件&#xff0c;用于構建面向 Web 和桌面的企業級數據可視化應用程序。 該套件中的組件具有連貫的 2D 和 3D 數據可視化效果&#xff0c;對觀眾產生巨大的視覺沖擊力。我…

基于window10的遠程桌面報錯:要求的函數不受支持 的問題解決方法

基于window10的遠程桌面報錯&#xff1a;要求的函數不受支持 的問題解決方法 設置方法&#xff1a; 一、WINR 在框內輸入gpedit.msc 二、依次打開 計算機配置----管理模板-----系統—憑據分配—加密數據庫修正–改為以啟用—易受攻擊 第一步&#xff1a; 第二步&#xff1a;…

并查集總結

并查集簡介 并查集是一種可以動態維護若干個不重疊的結合&#xff0c;并支持合并與查詢的數據結構 并查集是一種樹狀的數據結構&#xff0c;可以用于維護傳遞關系以及聯通性。 并查集有兩種操作&#xff1a; find&#xff1a;查詢一個元素屬于哪個集合merge:合并兩個集合 模…

爆款文章有訣竅,內容創作者如何能持續產出優質內容

內容營銷人有沒有這么一種共鳴&#xff1a;10 萬 那么多&#xff0c;為什么不能多我一個&#xff1f; 通常&#xff0c;我們把瀏覽量 / 閱讀量高、轉評贊數量高的內容看作爆款&#xff0c;而數據如果達到 10 萬 則是超級爆款。因為&#xff0c;閱讀量高意味著內容得到了大量的曝…