雪花算法的原理與實現
簡介
雪花算法(SnowFlake)是Twitter開源的一種用於在分布式環境下生成全局唯一ID的算法。並且提供了該算法的滿足工業級要求的Scala實現,該項目已經不再更新,官方宣稱是因為該實現高度依賴Twitter內部的網絡基礎設施,所以不具備普適性。
原理
雪花算法是將一個64位的整數分成三個部分:
- 41個比特位表示生成ID時的時間戳(精確到毫秒),所以理論上可以使用69年。
- 10個比特位表示當前機器的編號,所以理論上可以支持1024台機器。
- 12個比特位表示當前時間戳下已生成的雪花ID數量,所以理論上一毫秒內可以產生4096個不同的ID。
因為在有些語言中最高位是符號位,所以不用。
在實際使用中,可以根據實際情況來對64個比特位進行划分,比如:集群中的機器數量超過1024台,那么可以給機器多分配一個比特位。
優缺點
先說說優點:
- 一毫秒內可以生成4096個ID,可以用69年, 可用性非常高。
- 因為在分布式集群中使用機器編號來作區分,所以不會重復。
- 時間戳是遞增的,機器編號也是遞增的,序列號也是遞增的,所以ID的整體趨勢是遞增的,又因為不重復,所以ID可以作為數據庫索引來提高查詢效率。
它的優點很明顯,缺點也同樣明顯:
- ID和時鍾是強綁定的,一旦時間出現回退,就會出現重復的ID。
算法實現
算法的實現,我放在了我的GitHub倉庫中:https://github.com/funtrin/toys