Image

和朋友聊的時候提到雪花 ID,但我之前都無腦用套件(.Net 的 IdGen,香 )直接產完甩資料庫完事,因此趁著回家有空的時候趕快認識一下,順手也分享上來: Snowflake 算法

雪花演算法是用來產生唯一 ID 的算法,產出來的 ID 會有以下幾個部份:

  • 最前面的 1 bit 不使用,只會放 0 (畢竟放 1 被判定成負數就麻煩了)
  • 接續的 41 bit 用來放時間戳,精確到毫秒
    • 這段也是雪花 ID 能夠按照時間排序的原因
  • 中間 10 bit 用來放機器序號
  • 最後 12 bit 用來放序列號,會持續遞增

這樣就可以得到一組香香的雪花 ID 💯


雪花演算法的優點在於可以排序:因為使用時間戳,所以產生出來的 ID 是有順序性的。

可以排序的優點同時也避免了用 GUID 當 Key 的時候索引破碎之類的問題(延伸閱讀:GUID Primary Key資料庫避雷守則 - 黑暗執行緒

而缺點則是因為依賴時間戳來產生 ID,所以非常依賴機器上的時間。如果機器上的時間回溯了之類就會撞車出事

此外,如果系統是分散式的話,為了避免每台機器在同一時間各自產生的 ID 都一樣,所以要嘛就得集中在一個地方產生,或是分配每個機器唯一的機器序號(放在第三段的 10 bit)

雪花 ID 的產生方式簡單,目前成熟的語言也都有現成的套件可以使用。如果甩資料庫之後的 ID 需要有序,或是怕 GUID 碎掉、分庫之後 ID 不唯一之類的鬼故事,就可以考慮嘗試一下雪花演算法來產生 ID 再存放,藉此躲掉上面的問題

雖然我現在已經都偷懶用 NEWSEQUENTIALID() 了,嘻嘻

那麼,今天的轉貼就先到這邊。明天見 ><


相關資料: