Nil UUID (全ビットゼロ)

Nil UUID(00000000-0000-0000-0000-000000000000)を解説。センチネル値としての役割、使用場面、データベースにおけるNULLとの違いを詳しく説明します。

Format

詳細な説明

Nil UUIDは128ビットすべてがゼロに設定された特別なUUIDです:00000000-0000-0000-0000-000000000000。RFC 4122とRFC 9562の両方で、センチネル値やプレースホルダーとして機能する有効なUUIDとして明示的に定義されています。

バイナリ表現:

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000

バージョンとバリアント: Nil UUIDはどのバージョンやバリアントのエンコーディングにも準拠しません。バージョンビット(ビット48-51)は 0000 であり、バリアントビットも標準の 10 パターンに一致しません。UUIDバリデーションライブラリは、これを無効として拒否するのではなく特別なケースとして認識すべきです。

Nil UUID vs NULL: データベース設計において、Nil UUIDとSQL NULLは異なる目的を果たします。NULLは「値なし」または「不明」を意味し、SQLでは特殊な三値論理の振る舞い(NULL != NULL、NULL比較はNULLを返す)を持ちます。Nil UUIDは等値比較が可能で、外部キー制約に使用でき、通常どおりインデックスが作成できる実際の値です。値の不在がセマンティック的に意味を持つ場合はNULLを使用します。NOT NULL制約を満たしつつ具体的な「空」または「デフォルト」の識別子が必要な場合はNil UUIDを使用します。

一般的なユースケース:

  • NOT NULLが必要なUUIDカラムのデフォルト値
  • 「未割り当て」または「システム生成」を示すセンチネル値
  • ツリー構造におけるルートノード識別子
  • 実際のUUIDがまだ存在しない場合の設定プレースホルダー

コードでの検出:

function isNilUuid(uuid) {
  return uuid === '00000000-0000-0000-0000-000000000000';
}
import uuid
nil = uuid.UUID(int=0)  # or uuid.UUID('00000000-0000-0000-0000-000000000000')
assert nil == uuid.UUID(int=0)

重要な設計上の考慮事項: Nil UUIDをデフォルト値として使用する場合は、この慣習を明確にドキュメント化してください。開発者がこれを有効なエンティティ参照として誤って扱い、存在しないリソースに対する操作が実行されるバグにつながる可能性があります。UUIDをルックアップキーとして使用する前に、必ずNilでないことを検証してください。

ユースケース

Nil UUIDは、データベースにおけるUUID外部キーカラムのデフォルト値として広く使われており、NULLableカラムに頼らずに未リンクまたは孤立したレコードを表現できます。

試してみる — UUID Generator

フルツールを開く