java生成ID演算法
A. 怎樣生成 java 序列化id
你好:這個的話,可以這么搞
/**
*生成系統流水號
*@return流水號字元
*/
publicstaticStringgenerateNo(){
//接收流水號
StringgenerId="";
//生成5位隨機數
intradomInt=newRandom().nextInt(99999);
//獲取系統當前時間
StringdateInfo=DateUtil.getSysDate("yyMMddHHmm");
//當前系統時分秒加上五位隨機數,生成流水號
generId=dateInfo+String.valueOf(radomInt);
returngenerId;
}
B. 百度 UidGenerator 源碼解析
雪花演算法(Snowflake)是一種生成分布式全局唯一 ID 的演算法,用於推文 ID 的生成,並在 Discord 和 Instagram 等平台採用其修改版本。一個 Snowflake ID 由 64 位組成,其中前 41 位表示時間戳(毫秒數),接下來的 10 位用於標識計算機,12 位作為序列號,以確保同一毫秒內生成的多個 ID。此演算法基於時間生成,按時間排序,允許通過 ID 推斷生成時間。Snowflake ID 的生成包括時間戳、工作機器 ID 和序列號,確保了分布式環境中的全局唯一性。
在 Java 中實現的 UidGenerator 基於 Snowflake 演算法,支持自定義工作機器 ID 位數和初始化策略。它通過使用未來時間解決序列號的並發限制,採用 RingBuffer 緩存已生成的 UID,進行並行生產和消費,並對 CacheLine 進行補全以避免硬體級「偽共享」問題。在 Docker 等虛擬化環境下,UidGenerator 支持實例自動重啟和漂移場景,單機 QPS 可達 600 萬。
UidGenerator 採用不同的實現策略,如 DefaultUidGenerator 和 CachedUidGenerator。DefaultUidGenerator 提供了基礎的 Snowflake ID 生成模式,無需預存 UID,即時計算。而 CachedUidGenerator 則預先緩存 UID,通過 RingBuffer 提前填充並設置閾值自動填充機制,以提高生成效率。
RingBuffer 是 UidGenerator 的核心組件,用於緩存和管理 UID 的生成。在 DefaultUidGenerator 中,時間基點通過 epochStr 參數定義,用於計算時間戳。Worker ID 分配器在初始化階段自動為每個工作機器分配唯一的 ID。核心生成方法處理異常情況,如時鍾回撥,通過二進制運算生成最終的 UID。
CachedUidGenerator 則利用 RingBuffer 進行 UID 的緩存,根據填充閾值自動填充,以減少實時生成和計算的開銷。RingBuffer 的設計考慮了偽共享問題,通過 CacheLine 補齊策略優化讀寫性能,確保在並發環境中高效生成 UID。
總結而言,Snowflake 演算法和 UidGenerator 的設計旨在提供高性能、分布式且全局唯一的 ID 生成解決方案,適用於多種場景,包括高並發環境和分布式系統中。通過精心設計的組件和策略,確保了 ID 的生成效率和一致性,滿足現代應用對 ID 管理的嚴格要求。
C. 什麼是UUID,Java中怎麼產生UUID
UUID 是 通用唯一識別碼(Universally Unique Identifier)的縮寫,是一種軟體建構的標准,亦為開放軟體基金會組織在分布式計算環境領域的一部分。其目的,是讓分布式系統中的所有元素,都能有唯一的辨識信息,而不需要通過中央控制端來做辨識信息的指定。
生成UUID的方法:
public static String getUUID32(){ String uuid = UUID.randomUUID().toString().replace("-", "").toLowerCase(); return uuid;// return UUID.randomUUID().toString().replace("-", "").toLowerCase();}
註:因為一般資料庫主鍵為String類型,所以接收類型為String,生成的uuid數據包含-,所以要去掉-,故UUID.randomUUID().toString().replace("-", "").toLowerCase()。
(3)java生成ID演算法擴展閱讀:
UUID由以下幾部分的組合:
(1)當前日期和時間,UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其餘相同。
(2)時鍾序列。
(3)全局唯一的IEEE機器識別號,如果有網卡,從網卡MAC地址獲得,沒有網卡以其他方式獲得。
UUID的唯一缺陷在於生成的結果串會比較長。關於UUID這個標准使用最普遍的是微軟的GUID(Globals Unique Identifiers)。在ColdFusion中可以用CreateUUID()函數很簡單地生成UUID,其格式為:xxxxxxxx-xxxx- xxxx-xxxxxxxxxxxxxxxx(8-4-4-16)。
其中每個 x 是 0-9 或 a-f 范圍內的一個十六進制的數字。而標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12),可以從cflib 下載CreateGUID() UDF進行轉換。