首頁  >  文章  >  後端開發  >  實作雪花 ID 產生器

實作雪花 ID 產生器

Susan Sarandon
Susan Sarandon原創
2024-09-21 16:18:02193瀏覽

Implementing Snowflake Id generator

什麼是雪花 ID?

雪花 ID 用於分散式環境中,以產生無衝突、簡短、唯一的 ID。與依賴資料庫產生 ID 或使用長 128 位元 UUID 等傳統方法不同,Snowflake ID 使用時間和簡單的位元運算。這種巧妙的技術允許每個微服務獨立產生唯一的 ID,而不需要中央系統來避免衝突。

如何產生一個

產生雪花 ID 就像用三個關鍵部分建立拼圖一樣。讓我們來分解一下:

  1. 取一個n位長的位元串:

    首先,我們從長度為 n 的位元串開始。這將保存產生唯一 ID 所需的所有資訊。

  2. 分為三個部分:i、j、k:

    位元串分為三個部分,使得 i + j + k = n.

  • i - 時間組件:

    第一部分 i 表示當前時間。選擇一個固定的開始時間(也稱為紀元),i 的位元將透過以奈秒為單位的當前時間減去開始時間來計算。這可以確保新的 ID 始終大於舊的 ID。

  • j - 機器 ID:

    第二部分 j 是機器識別碼。當你的微服務啟動時,它會被分配一個唯一的ID(機器ID),它成為j部分。這可以確保不同機器產生的 ID 不會發生衝突,即使它們是在完全相同的時刻創建的。

  • k - 序號:

    最後一部分 k 是序號。它的作用就像一個計數器,只要在同一時間單位內產生多個 ID,該計數器就會增加。即使 ID 是快速連續產生的,這也能保持 ID 的唯一性。

  1. 組合各部分: 獲得 i、j 和 k 值後,將它們連接起來形成單位元字串。然後,將此位元字串轉換為基數 10,以獲得最終的雪花 ID。

一個簡單的類比

將雪花 ID 視為繁忙廚房中的特殊菜餚標籤:

  • 時間(i):這就像廚房裡的時鐘滴答作響,確保後來準備的菜餚比之前製作的菜餚數量更多。
  • 機器 ID (j):每個廚師(或微服務)都有自己的簽名,確保他們的菜餚標籤不會與其他人的相衝突。
  • 序號 (k):如果廚師在一瞬間製作多道菜,他們會在標籤上添加一個微小的增量,因此每道菜都有一個唯一的標籤。

Go 中實現的雪花

查看此 GitHub 儲存庫,以了解 Snowflake ID 產生的 Go 實作

來源

  1. https://blog.x.com/engineering/en_us/a/2010/announcing-snowflake
  2. https://en.wikipedia.org/wiki/Snowflake_ID

以上是實作雪花 ID 產生器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn