項目地址 : https://github.com/kelin-xycs/SeqIDGeneratorgit
今天 QQ 羣 裏有網友問起產生惟一 ID 的方法 有哪些, 討論了各類方法 。github
有網友提到 Twitter 的 雪花算法 : https://blog.csdn.net/w200221626/article/details/52064976算法
我以爲 GUID 的 優勢 是 簡單 高效, 缺點 是 可讀性 比較差 。數據庫
高效 是指 相比起 要到 數據庫 讀取 種子(當前最大序號) 等的方式, 同時 也 簡單, 不會出什麼問題 。服務器
若是 對 可讀性 有要求, 好比 要 顯示給 用戶 看, 或者 便於 維護, 可使用 針對業務 產生的 連續序號 ID , 好比 訂單號 。併發
若是 對 可讀性 沒什麼要求, 那麼 用 GUID 就行 。 或者說, 對 可讀性 沒太多要求 的 場合 能夠 通用 GUID 。負載均衡
但不少時候 咱們 也但願使用 可讀性好的 連續序號 ID , 因此就想有一個 簡單的 通用的 產生 連續序號 ID 的 方法 。高併發
因此, 就想出了一個 和 Twitter 雪花算法 相似 的 算法 :spa
這種算法 產生的 ID 格式以下 :.net
時間戳-機器ID-序號
時間戳 就是 「20181106213913983」 這樣, 表示 2018年11月06日21點39分13秒983毫秒 , 時間戳 取到 毫秒 。
機器ID 就是 計算機 ID, 或者說 服務器 ID, 由於如今 高併發 負載均衡 集羣 很常見, 因此須要考慮 多臺 Server 並行做業 時 的 狀況 。 並行做業 的 Server 之間的 連續序號 ID 不能重複, 對此, Twitter 雪花算法 是 經過 給 每一個 Server 一個 機器ID 來區分 , 因此 咱們 也學 Twitter 雪花算法 這樣 。
機器ID 在 App.config 中 配置 :
機器ID 能夠 本身隨便配置, 不過考慮到 連續序號 ID 的 排序 查詢 等, 取成 固定位數 的 數字 比較好 , 好比 上圖 中的 「0000」,
4 位 數字 能夠支持 1 萬 臺 Server (0000 ~ 9999) 。
序號 是指 這臺計算機上 當前這一毫秒 內 連續序號 ID 的 序號, 這一毫秒內 第一個 連續序號 ID 的 序號 是 0, 第二個是 1, 第三個是 2, 第四個是 3 …… , 以此類推 。 到下一毫秒 序號 會重置爲 從 0 從新開始 。
如今程序中寫死的 序號 格式 是 4 位 數字, 4 位 數字 能夠支持在 一臺計算機(多核)上 每毫秒 產生 1 萬 個 ID (0000 ~ 9999) 。
效果以下 : (運行 解決方案 中的 Demo 項目 就可看到)