雪花算法的原理與實現


雪花算法的原理與實現

簡介

雪花算法(SnowFlake)是Twitter開源的一種用於在分布式環境下生成全局唯一ID的算法。並且提供了該算法的滿足工業級要求的Scala實現,該項目已經不再更新,官方宣稱是因為該實現高度依賴Twitter內部的網絡基礎設施,所以不具備普適性。

原理

雪花算法是將一個64位的整數分成三個部分:

  • 41個比特位表示生成ID時的時間戳(精確到毫秒),所以理論上可以使用69年。
  • 10個比特位表示當前機器的編號,所以理論上可以支持1024台機器。
  • 12個比特位表示當前時間戳下已生成的雪花ID數量,所以理論上一毫秒內可以產生4096個不同的ID。

image

因為在有些語言中最高位是符號位,所以不用。

在實際使用中,可以根據實際情況來對64個比特位進行划分,比如:集群中的機器數量超過1024台,那么可以給機器多分配一個比特位。

優缺點

先說說優點:

  • 一毫秒內可以生成4096個ID,可以用69年, 可用性非常高。
  • 因為在分布式集群中使用機器編號來作區分,所以不會重復。
  • 時間戳是遞增的,機器編號也是遞增的,序列號也是遞增的,所以ID的整體趨勢是遞增的,又因為不重復,所以ID可以作為數據庫索引來提高查詢效率。

它的優點很明顯,缺點也同樣明顯:

  • ID和時鍾是強綁定的,一旦時間出現回退,就會出現重復的ID。

算法實現

算法的實現,我放在了我的GitHub倉庫中:https://github.com/funtrin/toys


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM