Golang で Snowflake アルゴリズムを実装する方法
Snowflake は、Twitter によってオープンソース化された分散 ID 生成アルゴリズムです。次の方法を使用して、グローバルに一意の ID を生成します:
- 64 ビット ID (1 は符号ビット、41 は符号ビット)は時刻スタンプ、10は作業機ID、12はシリアル番号です。
- 分散システムの場合、グローバルな一意性は通常、タイムスタンプ、ワーカー マシン ID、シリアル番号を組み合わせることで保証できます。
この記事では、Golang で Snowflake を実装する方法を紹介します。
- 構造体と定数の定義
最初に、マシン ID、シリアル番号、最後に生成された ID などのデータを Snowflake アルゴリズムに保存するための構造体を定義する必要があります。タイムスタンプやその他の情報。
const ( workerIdBits = 10 // 机器ID位数 sequenceBits = 12 // 序列号位数 workerIdMax = -1 ^ (-1 << workerIdBits) // 最大机器ID sequenceMask = -1 ^ (-1 << sequenceBits) // 序列号掩码 timeShiftBits = workerIdBits + sequenceBits // 时间戳左移位数 workerIdShift = sequenceBits // 机器ID左移位数 ) type Snowflake struct { lastTimestamp uint64 workerId uint16 sequence uint16 }
その中で、後続の計算を容易にするために、各データの桁数、最大値、マスクなどの情報を表すために定数を使用します。
- ID 生成メソッドの実装
次に、グローバルに一意の ID を生成するメソッドを実装する必要があります。
- 現在のタイムスタンプを取得します。それが最後に生成された ID のタイムスタンプより小さい場合は、タイムスタンプが更新されて最後に生成された ID のタイムスタンプより大きくなるまで待ちます。 ID。
- 現在のタイムスタンプが最後に生成された ID のタイムスタンプと等しい場合は、シーケンス番号を増やします。シーケンス番号が最大値に達した場合は、次のタイムスタンプまで待機します。
- 現在のタイムスタンプが最後に生成された ID のタイムスタンプより大きい場合は、シーケンス番号をリセットして現在のタイムスタンプを記録し、ID を生成します。
具体的な実装は次のとおりです。
func (s *Snowflake) NextId() uint64 { var currTimestamp = uint64(time.Now().UnixNano() / 1e6) if currTimestamp < s.lastTimestamp { panic("Invalid timestamp") } if currTimestamp == s.lastTimestamp { s.sequence = (s.sequence + 1) & sequenceMask if s.sequence == 0 { currTimestamp = s.waitNextMillis(currTimestamp) } } else { s.sequence = 0 } s.lastTimestamp = currTimestamp return ((currTimestamp - 1483228800000) << timeShiftBits) | (uint64(s.workerId) << workerIdShift) | uint64(s.sequence) } func (s *Snowflake) waitNextMillis(currTimestamp uint64) uint64 { for currTimestamp <= s.lastTimestamp { currTimestamp = uint64(time.Now().UnixNano() / 1e6) } return currTimestamp }
実装では、時刻を表すために UNIX タイムスタンプを使用しますが、Snowflake アルゴリズムが ID を生成する時期が 2017 年から始まっているため、 need タイムスタンプから固定オフセット値 (1483228800000) を減算します。
- Snowflake オブジェクトを初期化する
最後に、Snowflake オブジェクトを初期化し、マシン ID を指定する必要があります。マシン ID は 0 ~ 1023 の整数である必要があり、異なるマシンの ID は異なることが保証されます。
func New(workerId int) *Snowflake { if workerId < 0 || workerId > workerIdMax { panic(fmt.Sprintf("Invalid worker ID, must be in [%d, %d]", 0, workerIdMax)) } return &Snowflake{ lastTimestamp: 0, workerId: uint16(workerId), sequence: 0, } }
上記の実装では、Golang のタイムスタンプ関数と二項演算子を使用して ID の一意性と連続性を確保し、下位のシーケンス番号によって ID の増加傾向を確保しました。タイムスタンプはミリ秒レベルまで正確であるため、Snowflake アルゴリズムは、同時実行性の高いシナリオで ID の競合を回避するのに十分な ID を生成できます。
以上がGolang で Snowflake アルゴリズムを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

この記事では、go.modを介してGOモジュールの依存関係の管理、仕様、更新、競合解決をカバーすることについて説明します。セマンティックバージョンや定期的な更新などのベストプラクティスを強調しています。

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

この記事では、GOでテーブル駆動型のテストを使用して説明します。これは、テストのテーブルを使用して複数の入力と結果を持つ関数をテストする方法です。読みやすさの向上、重複の減少、スケーラビリティ、一貫性、および
