Snowflakeアルゴリズムは、Twitter上の分散ユニークなID生成アルゴリズムオープンソースです。分散システムで一意のIDを生成する問題を解決するように設計されています。このアルゴリズムは、タイムスタンプ、マシンID、および自己挿入シーケンスパーツを含む64ビットの整数をIDとして取得します。この記事では、PHPコードの例を使用して、このアルゴリズムを実装して分散した一意のIDを生成する方法を示します。
スノーフレークアルゴリズムの64ビットIDは、次の部分で構成されています。
タイムスタンプの部分は42ビットを占めており、表現できる時間範囲は2010年1月1日から2039年9月7日までで、ミリ秒の精度があります。
マシンIDパーツは10ビットを占め、最大1024マシンをサポートします。
セルフコンクールシーケンスパーツは12ビットを占め、最大4096 IDがミリ秒あたり生成されます。
以下は、分散ユニークなIDを生成するためにスノーフレークアルゴリズムを実装するPHPサンプルコードです。
class Snowflake {
private $machineId; // 機械ID
private $epoch = 1288834974657; // 初期タイムスタンプ,タイムスタンプ部分の値を計算するために使用されます
private $sequence = 0; // シリアル番号パーツ
// コンストラクタ
public function __construct($machineId) {
$this->machineId = $machineId;
}
// 一意を生成しますID
public function generateId() {
$timestamp = $this->getTimestamp();
$snowflakeId = (($timestamp - $this->epoch) << 22) | ($this->machineId << 12) | $this->sequence;
return $snowflakeId;
}
// 現在のタイムスタンプを入手してください,ユニットミリ秒
private function getTimestamp() {
return floor(microtime(true) * 1000);
}
}
// 使用の例
$snowflake = new Snowflake(1); // 传入機械ID
$id = $snowflake->generateId();
echo $id;
上記のコードでは、Snowflakeというクラスを定義します。コンストラクターは、マシンIDをパラメーターとして取得し、クラスのプライベート変数に保存します。 GenerateID()メソッドは、一意のIDを生成するコア部分です。最初に現在のタイムスタンプを取得し、次にスノーフレークアルゴリズムの構造に従って、タイムスタンプ、マシンID、シーケンス番号を一意のIDに組み合わせます。 getTimestamp()メソッドは、現在のタイムスタンプ(ミリ秒単位)を取得するために使用されます。使用方法の使用法では、Machine ID 1を使用してSnowflakeオブジェクトをインスタンス化し、GenerateID()メソッドを呼び出して一意のIDを生成し、最後に結果を印刷します。
この記事では、PHPを使用してSnowflakeアルゴリズムを実装して分散した一意のIDを生成する方法について詳しく説明しています。この方法で生成されたIDは、独自性とスケーラビリティが高く、分散システムのさまざまなシナリオに適しています。スノーフレークアルゴリズムの中心的なアイデアは、タイムスタンプ、マシンID、シリアル番号を使用してIDを生成して、各生成されたIDが一意であり、生成効率が高いことを確認することです。