知識マップ: UUID は衝突しないのか - 間違った運用と実装で重複を招くパターン

記事「UUID は衝突しないのか - 間違った運用と実装で重複を招くパターン」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

UUIDの衝突事故の多くは規格そのものではなく、生成や運用が前提を壊すことで起きると整理する記事です。RFC 9562が定めるUUIDv4はCSPRNGによる122ビットの乱数領域を、UUIDv7はカウンタによる単調性の設計を前提としており、固定seedの弱いPRNGでの自作やfork・snapshot後の生成器状態の巻き戻り、UUIDv3/v5を新規採番用途に誤用すること、UUIDv8の実装依存な一意性への過信、128ビットを削る切り詰めがいずれも重複を招きます。RFC自身が真のglobal uniquenessを絶対保証しないとしている以上、DB側のUNIQUE制約が重複挿入を防ぐ最終防衛線になります。

UUIDの衝突を招く実装パターンの知識マップUUIDv4・UUIDv7・UUIDv3/v5・UUIDv8・UUIDv1/v6それぞれがRFC 9562で定義されること、弱いPRNGでの自作・生成器の状態の巻き戻り・name-based UUIDの新規採番への誤用・カウンタの桁あふれ・時刻の巻き戻り・切り詰めがいずれもUUIDの衝突を招くこと、CSPRNGの利用とfork後の再seedとDB側の一意制約がその対策になることを示す図推奨される対応用いるのは非推奨用いるのは非推奨用いるのは非推奨原因になり得る原因になり得る原因になり得る原因になり得る原因になり得る原因になり得る軽減する軽減する防止する利用する両立しない両立しない利用する前提とするで確認できるで確認できるで確認できるで確認できるで確認できる原因になり得るで確認できるUUIDRFC 9562CSPRNGUUIDv4弱いPRNGによるUUID自作新規採番UUIDv3/v5UUIDv8UUIDの衝突生成器の状態カウンタの桁あふれ時刻の巻き戻りUUIDの切り詰めDB側の一意制約fork後の再seedUUIDv7単調性namespace正規化UUIDv1/v6

概念間の関係(全25件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

UUID
128ビットの識別子で、実装上十分な一意性を提供する一方、真のglobal uniquenessを絶対保証はしない識別子形式のこと。
RFC 9562
UUIDの形式、各version、生成のベストプラクティスを定めるIETFの標準文書のこと。
CSPRNG
次の値を予測しにくいことを設計目標に含む、暗号学的に安全な疑似乱数生成器のこと。
弱いPRNGによるUUID自作
一般用途のPRNGを固定seedなどで回し、UUID形式の文字列を自前で組み立てる実装のこと。
UUIDv3/v5
同じnamespaceと同じcanonical nameから同じUUIDを再生成する、決定論的なUUIDv3/UUIDv5の総称のこと。
UUIDv8
一意性が実装依存であり前提にしてはいけないと定められた、実験用・ベンダー独自用のUUIDのこと。
生成器の状態
乱数の内部状態、clock sequence、カウンタなど、次のUUIDを決める生成器の状態のこと。
カウンタの桁あふれ
カウンタが最大値を超えて0へ戻ることのこと。
時刻の巻き戻り
NTP補正や手動変更で、システム時刻が前の値へ戻ることのこと。
UUIDの切り詰め
先頭数文字だけの利用や64ビット整数への圧縮など、128ビットの一意性の材料そのものを削る変換のこと。
DB側の一意制約
列や列集合の値がテーブル全体で一意であることを保証する、DB側のUNIQUE/PRIMARY KEY制約のこと。
fork後の再seed
process forkのような状態変化のたびに、CSPRNGの状態を再seedすることのこと。
UUIDv7
48ビットのUnixミリ秒タイムスタンプに、乱数やcarefully seeded counterによる74ビットを組み合わせる、時系列ソート可能なUUIDのこと。
UUIDv4
version/variantを除く122ビットを乱数で埋める、ランダムベースのUUIDのこと。
UUIDv1/v6
MACアドレス由来のnodeとclock sequenceを使う時刻系のUUIDのこと。UUIDv6はDB localityの改善のためUUIDv1を並べ替えたもの。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。