A Universally Unique Identifier (UUID) は、情報を一意に識別するためにコンピューター システムで使用される 128 ビットのラベルです。 UUID は、時空を超えて一意になるように設計されており、中央機関なしで独立して生成できるため、重複のリスクが最小限に抑えられます。
UUID は次のようなさまざまな目的に役立ちます:
- データベース内のレコードを識別します。
- 分散システム内のオブジェクトのタグ付け。
- 一意性が重要なアプリケーションで主キーとして機能します。
実際の使用例
-
データベース: UUID は、レコードの一意の識別を保証するために、リレーショナル データベースの主キーとして使用されます。
-
マイクロサービス: リクエストとリソースに一意の識別子を提供することでサービス通信を促進します。
-
IoT デバイス: ネットワーク内のデバイスを一意に識別し、複数のソースからのデータが競合することなく集約できるようにします。
UUID使用のメリットとデメリット
利点:
-
グローバルな一意性: UUID は衝突する可能性が非常に低いため、複数のノードが個別に識別子を生成する分散システムに適しています。
-
中央機関は不要: 調整なしで生成できるため、分散環境での操作が簡素化されます。
-
スケーラビリティ: 複数のサーバーまたはサービスにわたるスケーリングが必要なシステムでうまく機能します。
短所:
-
ストレージ サイズ: UUID は、従来の整数 ID (通常は 32 ビット) に比べてより多くのスペース (128 ビット) を消費するため、ストレージ コストの増加につながる可能性があります。
-
パフォーマンスの問題: UUID のインデックス作成は、そのランダム性とサイズによりデータベースのパフォーマンスを低下させる可能性があり、シーケンシャル ID と比較してクエリ時間が遅くなる可能性があります。
-
ユーザーの不親切さ: UUID は、ユーザー インターフェースに表示される場合、覚えにくく、またユーザーフレンドリーではありません。
スタンダード
UUID の標準表現は、8-4-4-4-12 の形式に従い、ハイフンで区切られた 5 つのグループに分割された 32 個の 16 進文字で構成され、合計 36 文字 (32 個の英数字と 4 個のハイフン) になります。 .
UUID 形式は次のように視覚化できます:
xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx
どこ:
-
MはUUIDのバージョンを示します。
-
N はバリアントを示し、UUID のレイアウトの解釈に役立ちます。
UUIDのコンポーネント
-
TimeLow: タイムスタンプの下位フィールドを表す 4 バイト (8 つの 16 進数文字)。
-
TimeMid: タイムスタンプの中間フィールドを表す 2 バイト (4 つの 16 進数文字)。
-
TimeHighAndVersion: バージョン番号とタイムスタンプの高位フィールドを含む 2 バイト (4 つの 16 進数文字)。
-
ClockSequence: 2 バイト (4 つの 16 進数文字) は、特に複数の UUID がすぐに連続して生成される場合、またはシステム クロックが調整される場合に、衝突を回避するために使用されます。
-
Node: 6 バイト (12 個の 16 進数文字)。通常、生成ノードの MAC アドレスを表します。
UUIDの種類
バージョン 1: 現在のタイムスタンプと生成ノードの MAC アドレスの組み合わせを使用する時間ベースの UUID。このバージョンでは、時空を越えた一意性が保証されます。
バージョン 2: バージョン 1 に似ていますが、ローカル ドメイン識別子が含まれています。ただし、制限があるため、あまり一般的には使用されません。
バージョン 3: 名前空間識別子と名前の MD5 ハッシュを使用して生成された名前ベースの UUID。
バージョン 4: ランダムに生成された UUID により、高いランダム性と一意性が提供され、バージョン管理用に数ビットのみが予約されています。
バージョン 5: バージョン 3 と似ていますが、ハッシュに SHA-1 を使用するため、バージョン 3 より安全です。
バリエーション
UUID のバリアント フィールドによって、そのレイアウトと解釈が決まります。最も一般的なバリエーションは次のとおりです:
-
バリアント 0: NCS の下位互換性のために予約されています。
-
バリアント 1: ほとんどの UUID で使用される標準レイアウト。
-
バリアント 2: あまり一般的ではない DCE セキュリティ UUID に使用されます。
-
バリアント 3: 将来の定義のために予約されています。
例
バージョン 4 の場合、UUID は次のようになります:
550e8400-e29b-41d4-a716-446655440000
ここ:
-
41d4 はバージョン 4 であることを示します。
-
a7 はバリアントを表し、この場合は一般的な「Leach-Salz」バリアントを表します。
UUID の計算方法
-
バージョン 1 (時間ベース):
- タイムスタンプは通常、1582 年 10 月 15 日 (グレゴリオ暦改革の日) からの 100 ナノ秒間隔の数です。
- ノードは、UUIDを生成するマシンのMACアドレスです。
- クロック シーケンスは、クロック時間が変更された場合(システムの再起動などにより)一意性を確保するのに役立ちます。
-
バージョン 3 およびバージョン 5 (名前ベース):
- 名前空間 (DNS ドメインなど) は名前 (ファイル パスや URL など) と結合され、ハッシュされます。
- ハッシュ (バージョン 3 の場合は MD5、バージョン 5 の場合は SHA-1) は UUID 形式に構造化され、バージョン フィールドとバリアント フィールドが適切に設定されていることを確認します。
-
バージョン 4 (ランダムベース):
- UUID の 122 ビットに対して乱数または擬似乱数が生成されます。
- バージョンとバリアントのフィールドはそれに応じて設定され、UUID 標準への準拠が保証されます。
UUIDv4 の計算例
ステップ 1: 128 のランダム ビットを生成
次の 128 ビットのランダム値を生成すると仮定します:
11001100110101101101010101111010101110110110111001011101010110110101111011010011011110100100101111001011
ステップ 2: UUIDv4 バージョンとバリアントを適用する
Version: ビット 12 ~ 15 (4 番目の文字) を 0100 (UUID バージョン 4 の場合) に置き換えます。
元の値: 1100 が 0100 になる → この位置の値が更新されました。
バリアント: 9 番目のバイトのビット 6 ~ 7 を 10 に置き換えます (RFC 4122 バリアントの場合)。
元の値: 11 が 10 になる → この位置の値が更新されました。
ステップ 3: 16 進数にフォーマットする
128 ビット バイナリを 5 つの 16 進数グループに変換します:
- 32ビットグループ: 11001100110101101101010101111010 → ccda55ba
- 16ビットグループ: 1011101101101110 → b76e
- 16 ビット グループ: 0100010101000101 → 4545 (バージョン 4 の場合は 0100)
- 16 ビット グループ: 1010110111110010 → adf2 (バリアントは 10)
- 48 ビット グループ: 11010011011110100100101111001011 → d39d25cb
ステップ 4: グループを結合する
最終的な UUID は次のようになります:
ccda55ba-b76e-4545-adf2-d39d25cb