メインコンテンツまでスキップ

5.1. UUID Version 1

5.1. UUID Version 1

UUIDv1 は時間ベースの UUID で, 協定世界時 (Coordinated Universal Time, UTC) で表される 60 ビットのタイムスタンプを特徴とし, 1582 年 10 月 15 日 00:00:00.00 (グレゴリオ暦改革のキリスト教暦の日付) からの 100 ナノ秒間隔のカウントとして表されます。

UUIDv1 はまた, 時計が時間的に後方に設定された場合や Node ID が変更された場合に発生する可能性のある重複を回避するために使用されるクロックシーケンスフィールドも特徴としています。

ノードフィールドは IEEE 802 MAC アドレスで構成され, 通常はホストアドレスまたはセクション 6.9 および 6.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_low |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| time_mid | ver | time_high |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| clock_seq | node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| node |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

図 6: UUIDv1 フィールドとビットレイアウト

フィールド定義:

time_low: 60 ビット開始タイムスタンプの最下位 32 ビット。ビット 0 から 31 (オクテット 0-3) を占有します。

time_mid: 60 ビット開始タイムスタンプの中間 16 ビット。ビット 32 から 47 (オクテット 4-5) を占有します。

ver: セクション 4.2 で定義された 4 ビットバージョンフィールド, 0b0001 (1) に設定。オクテット 6 のビット 48 から 51 を占有します。

time_high: 60 ビット開始タイムスタンプの最下位 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) を占有します。

UTC が利用できないがローカル時刻がある��ステムの場合, システム全体で一貫して使用する限り, UTC の代わりにローカル時刻を使用できます。ただし, ローカル時刻から UTC を生成するにはタイムゾーンオフセットのみが必要なため, これは推奨されません。

時計が後方に設定された場合, またはそれが後方に設定されていた可能性がある場合 (システムの電源がオフになっている間など), そして UUID ジェネレーターが時計が設定された値よりも大きいタイムスタンプで UUID が生成されなかったことを確認できない場合, クロックシーケンスを変更しなければなりません。クロックシーケンスの以前の値がわかっている場合は増分できます。それ以外の場合は, ランダムまたは高品質の疑似ランダム値に設定する必要があります。

同様に, Node ID が変更された場合 (ネットワークカードがマシン間で移動されたなど), クロックシーケンスを乱数に設定することで, マシンのクロック設定のわずかな違いによる重複の確率を最小限に抑えます。変更された Node ID に関連付けられたクロックシーケンスの値がわかっている場合, クロックシーケンスを増分できますが, それはまずありません。

クロックシーケンスは, システム間の相関を最小限に抑えるために, 最初に (つまり, システムの生涯で一度) 乱数に初期化しなければなりません。これにより, システム間で急速に移動または切り替わる可能性のある Node ID に対する最大の保護が提供されます。