4. Specification (仕様)
4.1. Format (形式)
UUID 形式は 16 オクテットです; 以下で指定される 8 オクテットのバリアントフィールドの一部のビットが, より細かい構造を決定します。
4.1.1. Variant (バリアント)
バリアントフィールドは UUID のレイアウトを決定します。つまり, UUID 内の他のすべてのビットの解釈は, バリアントフィールド内のビットの設定に依存します。バリアントフィールドは, UUID のオクテット 8 の最上位ビットの可変数で構成されます。
次の表は, バリアントフィールドの内容を示しています。ここで, 文字 "x" は "どちらでもよい" 値を示します。
| Msb0 | Msb1 | Msb2 | Description (説明) |
|---|---|---|---|
| 0 | x | x | Reserved, NCS backward compatibility (予約済み, NCS 後方互換性) |
| 1 | 0 | x | The variant specified in this document (本文書で指定されたバリアント) |
| 1 | 1 | 0 | Reserved, Microsoft Corporation backward compatibility (予約済み, Microsoft Corporation 後方互換性) |
| 1 | 1 | 1 | Reserved for future definition (将来の定義のために予約済み) |
4.1.2. Layout and Byte Order (レイアウトとバイト順序)
オクテット内のビット割り当てに関する混乱を最小限に抑えるため, UUID レコード定義は, オクテットの整数倍であるフィールドのみで定義されます。フィールドは最上位のものが最初に表示されます。
| Field (フィールド) | Data Type (データ型) | Octet # (オクテット番号) | Note (注記) |
|---|---|---|---|
| time_low | unsigned 32 bit integer (符号なし 32 ビット整数) | 0-3 | The low field of the timestamp (タイムスタンプの下位フィールド) |
| time_mid | unsigned 16 bit integer (符号なし 16 ビット整数) | 4-5 | The middle field of the timestamp (タイムスタンプの中位フィールド) |
| time_hi_and_version | unsigned 16 bit integer (符号なし 16 ビット整数) | 6-7 | The high field of the timestamp multiplexed with the version number (バージョン番号と多重化されたタイムスタンプの上位フィールド) |
| clock_seq_hi_and_reserved | unsigned 8 bit integer (符号なし 8 ビット整数) | 8 | The high field of the clock sequence multiplexed with the variant (バリアントと多重化されたクロックシーケンスの上位フィールド) |
| clock_seq_low | unsigned 8 bit integer (符号なし 8 ビット整数) | 9 | The low field of the clock sequence (クロックシーケンスの下位フィールド) |
| node | unsigned 48 bit integer (符号なし 48 ビット整数) | 10-15 | The spatially unique node identifier (空間的に一意なノード識別子) |
UUID 構造 (128 ビット):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | time_hi_and_version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|clk_seq_hi_res | clk_seq_low | node (0-1) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node (2-5) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4.1.3. Version (バージョン)
バージョン番号は, タイムスタンプの最上位 4 ビット (time_hi_and_version フィールドのビット 4 からビット 7) にあります。
次の表は, この UUID バリアントの現在定義されているバージョンを示しています:
| Msb0-3 | Version (バージョン) | Description (説明) |
|---|---|---|
| 0001 | 1 | The time-based version specified in this document (本文書で指定された時刻ベースのバージョン) |
| 0010 | 2 | DCE Security version, with embedded POSIX UIDs (POSIX UID が埋め込まれた DCE セキュリティバージョン) |
| 0011 | 3 | The name-based version specified in this document that uses MD5 hashing (MD5 ハッシュを使用する本文書で指定された名前ベースのバージョン) |
| 0100 | 4 | The randomly or pseudo-randomly generated version specified in this document (本文書で指定されたランダムまたは疑似ランダムに生成されたバージョン) |
| 0101 | 5 | The name-based version specified in this document that uses SHA-1 hashing (SHA-1 ハッシュを使用する本文書で指定された名前ベースのバージョン) |
4.1.4. Timestamp (タイムスタンプ)
タイムスタンプは 60 ビット値です。UUID バージョン 1 の場合, これは協定世界時 (UTC) で表され, 1582 年 10 月 15 日 00:00:00.00 (グレゴリオ暦改革の日付) 以降の 100 ナノ秒間隔のカウントです。
UUID バージョン 3 または 5 の場合, タイムスタンプはセクション 4.3 で説明されているように, 名前から構築された 60 ビット値です。
UUID バージョン 4 の場合, タイムスタンプはセクション 4.4 で説明されているように, ランダムまたは疑似ランダムに生成された 60 ビット値です。
4.1.5. Clock Sequence (クロックシーケンス)
UUID バージョン 1 の場合, クロックシーケンスは, クロックが時間的に後戻りした場合, またはノード ID が変更された場合に発生する可能性のある重複を回避するために使用されます。
クロックシーケンスは, システム間の相関を最小限に抑えるため, 最初に (つまり, システムの生涯に一度) 乱数に初期化されなければなりません (MUST)。
UUID バージョン 3 または 5 の場合, クロックシーケンスはセクション 4.3 で説明されているように, 名前から構築された 14 ビット値です。
UUID バージョン 4 の場合, クロックシーケンスはランダムまたは疑似ランダムに生成された 14 ビット値です。
4.1.6. Node (ノード)
UUID バージョン 1 の場合, ノードフィールドは IEEE 802 MAC アドレスで構成され, 通常はホストアドレスです。複数の IEEE 802 アドレスを持つシステムの場合, 利用可能な任意のアドレスを使用できます。
UUID バージョン 3 または 5 の場合, ノードフィールドはセクション 4.3 で説明されているように, 名前から構築された 48 ビット値です。
UUID バージョン 4 の場合, ノードフィールドはランダムまたは疑似ランダムに生成された 48 ビット値です。
4.1.7. Nil UUID (空 UUID)
空 UUID は UUID の特別な形式であり, すべての 128 ビットがゼロに設定されていることが指定されています:
00000000-0000-0000-0000-000000000000
4.2. Algorithms for Creating a Time-Based UUID (時刻ベース UUID 生成アルゴリズム)
4.2.1. Basic Algorithm (基本アルゴリズム)
時刻ベース UUID を生成するための基本アルゴリズム:
- システム全体のグローバルロックを取得する
- 現在時刻を読み取る
- 現在のノード ID を取得する
- 最後に UUID が生成されてからノード ID が変更された場合, クロックシーケンスをランダム値に設定する
- 現在時刻が最後のタイムスタンプより前の場合, クロックシーケンスをインクリメントする
- タイムスタンプとノード ID を保存する
- グローバルロックを解放する
- タイムスタンプ, クロックシーケンス, およびノード ID を使用して UUID をフォーマットする
4.2.2. Generation Details (生成の詳細)
Timestamp (タイムスタンプ): タイムスタンプは, システム時刻から構築された 60 ビット値です。タイムスタンプの解像度は 100 ナノ秒です。
Clock Sequence (クロックシーケンス): クロックシーケンスは最初にランダム値に設定されます。クロックが後戻りするか, ノード ID が変更されるたびにインクリメントされます。
Node ID (ノード ID): ノード ID は通常 IEEE 802 MAC アドレスです。
4.3. Algorithm for Creating a Name-Based UUID (名前ベース UUID 生成アルゴリズム)
名前ベース UUID (バージョン 3 またはバージョン 5) を生成するアルゴリズム:
- その名前空間内の名前から生成されたすべての UUID の "名前空間 ID" として使用する UUID を割り当てる
- ハッシュアルゴリズムとして MD5 (バージョン 3) または SHA-1 (バージョン 5) のいずれかを選択する
- 名前を正規オクテットシーケンスに変換する
- 名前空間 ID と名前を連結したハッシュを計��する
- オクテット 0 から 15 を, ハッシュのオクテット 0 から 15 に設定する
- オクテット 6 の最上位 4 ビット (ビット 12 からビット 15) を適切なバージョン番号に設定する
- オクテット 8 の最上位 2 ビット (ビット 6 とビット 7) をそれぞれゼロと 1 に設定する
4.4. Algorithms for Creating a UUID from Truly Random or Pseudo-Random Numbers (真の乱数または疑似乱数からの UUID 生成アルゴリズム)
バージョン 4 UUID は, 真の乱数または疑似乱数から UUID を生成するためのものです。
アルゴリズムは次のとおりです:
- すべてのビットをランダム (または疑似ランダム) に選択された値に設定する
- オクテット 6 の最上位 4 ビット (ビット 12 からビット 15) を 4 ビットバージョン番号 (0100 2 進数) に設定する
- オクテット 8 の最上位 2 ビット (ビット 6 とビット 7) をそれぞれゼロと 1 に設定する
⚠️ ビットマスクロジックの正確な説明:
バージョン 4 UUID の場合, 次の正確なビット演算を実行しなければなりません (MUST):
- バージョンビット設定 (Version Bits): オクテット 6 のビット 12-15 を
0100(2 進数), すなわち 10 進値 4 に設定しなければなりません (MUST) - バリアントビット設定 (Variant Bits): オクテット 8 のビット 6-7 を
10(2 進数) に設定しなければなりません (MUST) - ランダムビット (Random Bits): 他のすべての 122 ビットは, 暗号的に安全なランダムソースまたは高品質の疑似乱数生成器から取得しなければなりません (MUST)
実装例 (疑似コード):
uuid[6] = (uuid[6] & 0x0F) | 0x40; // バージョンを 4 に設定 (0100xxxx)
uuid[8] = (uuid[8] & 0x3F) | 0x80; // バリアントを 10xxxxxx に設定
4.5. Node IDs that Do Not Identify the Host (ホストを識別しないノード ID)
このセクションでは, ホストを識別しないノード ID を生成するための代替案について説明します:
-
Random Node ID (ランダムノード ID): ノード ID の最初のオクテットの最下位ビットを 1 (マルチキャストビット) に設定します。これにより, UUID が実際の MAC アドレスに基づいていないことがマークされます。
-
Persistent Random Node ID (永続的ランダムノード ID): ランダムノード ID を一度生成し, 再利用のために保存します。これにより, プライバシーを維持しながら, 再起動間での一貫性が提供されます。
注記: 詳細な実装例と完全なアルゴリズムについては, 公式 RFC 4122 仕様および附属書 A を参照してください。