5.6. UUID Version 6
5.6. UUID Version 6
UUIDv6 は、UUIDv1 (セクション 5.1) のフィールド互換バージョンで、DB の局所性を改善するために並べ替えられています。UUIDv6 は主に UUIDv1 が使用されているコンテキストで実装されることが予想されます。レガシー UUIDv1 を含まないシステムは、代わりに UUIDv7 (セクション 5.7) を使用すべきです。
UUIDv1 のようにタイムスタンプを低位、中位、高位のセクションに分割する代わりに、UUIDv6 はこのシーケンスを変更し、タイムスタンプバイトが最上位から最下位の順に格納されるようにします。つまり、セクション 5.1 で UUIDv1 に指定された 60 ビットのタイムスタンプ値が与えられた場合、UUIDv6 では最上位の 48 ビットが最初に格納され、次に 4 ビットのバージョン (同じ位置)、次に元の 60 ビットのタイムスタンプの残りの 12 ビットが続きます。
クロックシーケンスとノードビットは、セクション 5.1 の位置から変更されません。
生成される新しい UUIDv6 ごとに、クロックシーケンスとノードビットは疑似ランダム値にリセットされるべきです。ただし、実装はセクション 5.1 の古いクロックシーケンスと MAC アドレスの動作を保持することを選択できます。UUID 内での MAC アドレスの使用に関する詳細については、セクション 8 を参照してください。
16 バイト 128 ビット UUIDv6 のフォーマットを図 10 に示します。
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_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | ver | time_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| clock_seq | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
図 10: UUIDv6 フィールドとビットレイアウト
フィールド定義:
time_high: 60 ビット開始タイムスタンプの最上位 32 ビット。ビット 0 から 31 (オクテット 0-3) を占有します。
time_mid: 60 ビット開始タイムスタンプの中間 16 ビット。ビット 32 から 47 (オクテット 4-5) を占有します。
ver: セクション 4.2 で定義されている 4 ビットのバージョンフィールドで、0b0110 (6) に設定されます。オクテット 6 のビット 48 から 51 を占有します。
time_low: 60 ビット開始タイムスタンプから最下位 12 ビットを含む 12 ビット。ビット 52 から 63 (オクテット 6-7) を占有します。
var: セクション 4.1 で定義されている 2 ビットのバリアントフィールドで、0b10 に設定されます。オクテット 8 のビット 64 と 65 を占有します。
clock_seq: クロックシーケンスを含む 14 ビット。ビット 66 から 79 (オクテット 8-9) を占有します。
node: 48 ビット空間的一意識別子。ビット 80 から 127 (オクテット 10-15) を占有します。
UUIDv6 では、time_high と time_mid の 48 ビットが同じ順序のままであるため、タイムスタンプを time_high と time_mid に分割する手順はオプションです。既存の UUIDv1 実装を再利用する場合、タイムスタンプの最初の 48 ビットを最上位 32 ビットと最下位 16 ビットに分割する追加の手順が役立ちます。