知識マップ: UUID は衝突しないのか - 間違った運用と実装で重複を招くパターン
記事「UUID は衝突しないのか - 間違った運用と実装で重複を招くパターン」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
UUIDの衝突事故の多くは規格そのものではなく、生成や運用が前提を壊すことで起きると整理する記事です。RFC 9562が定めるUUIDv4はCSPRNGによる122ビットの乱数領域を、UUIDv7はカウンタによる単調性の設計を前提としており、固定seedの弱いPRNGでの自作やfork・snapshot後の生成器状態の巻き戻り、UUIDv3/v5を新規採番用途に誤用すること、UUIDv8の実装依存な一意性への過信、128ビットを削る切り詰めがいずれも重複を招きます。RFC自身が真のglobal uniquenessを絶対保証しないとしている以上、DB側のUNIQUE制約が重複挿入を防ぐ最終防衛線になります。
flowchart LR
accTitle: UUIDの衝突を招く実装パターンの知識マップ
accDescr: UUIDv4・UUIDv7・UUIDv3/v5・UUIDv8・UUIDv1/v6それぞれがRFC 9562で定義されること、弱いPRNGでの自作・生成器の状態の巻き戻り・name-based UUIDの新規採番への誤用・カウンタの桁あふれ・時刻の巻き戻り・切り詰めがいずれもUUIDの衝突を招くこと、CSPRNGの利用とfork後の再seedとDB側の一意制約がその対策になることを示す図
uuid["UUID"]
rfc9562["RFC 9562"]
csprng["CSPRNG"]
uuidv4["UUIDv4"]
weak_prng_uuid["弱いPRNGによるUUID自作"]
new_record_id_issuance["新規採番"]
name_based_uuid["UUIDv3/v5"]
uuidv8["UUIDv8"]
uuid_collision["UUIDの衝突"]
generator_state["生成器の状態"]
counter_rollover["カウンタの桁あふれ"]
clock_rollback["時刻の巻き戻り"]
uuid_truncation["UUIDの切り詰め"]
db_unique_constraint["DB側の一意制約"]
fork_reseed["fork後の再seed"]
uuidv7["UUIDv7"]
monotonicity["単調性"]
namespace_uuid["namespace"]
canonicalization["正規化"]
uuidv1_v6["UUIDv1/v6"]
csprng -->|"推奨される対応"| uuidv4
weak_prng_uuid -->|"用いるのは非推奨"| new_record_id_issuance
name_based_uuid -->|"用いるのは非推奨"| new_record_id_issuance
uuidv8 -->|"用いるのは非推奨"| new_record_id_issuance
weak_prng_uuid -.->|"原因になり得る"| uuid_collision
generator_state -.->|"原因になり得る"| uuid_collision
name_based_uuid -.->|"原因になり得る"| uuid_collision
counter_rollover -.->|"原因になり得る"| uuid_collision
clock_rollback -.->|"原因になり得る"| uuid_collision
uuid_truncation -->|"原因になり得る"| uuid_collision
db_unique_constraint -->|"軽減する"| uuid_collision
fork_reseed -->|"軽減する"| uuid_collision
csprng -->|"防止する"| weak_prng_uuid
uuidv7 -.->|"利用する"| monotonicity
counter_rollover -.->|"両立しない"| monotonicity
clock_rollback -.->|"両立しない"| monotonicity
name_based_uuid -->|"利用する"| namespace_uuid
name_based_uuid -->|"前提とする"| canonicalization
uuidv4 -->|"で確認できる"| rfc9562
uuidv7 -->|"で確認できる"| rfc9562
name_based_uuid -->|"で確認できる"| rfc9562
uuidv8 -->|"で確認できる"| rfc9562
uuidv1_v6 -->|"で確認できる"| rfc9562
uuidv1_v6 -.->|"原因になり得る"| uuid_collision
uuid -->|"で確認できる"| rfc9562
概念間の関係(全25件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- CSPRNGはUUIDv4に対する本記事の推奨です。
- 弱いPRNGによるUUID自作を新規採番に用いることは推奨されません。
- UUIDv3/v5を新規採番に用いることは推奨されません。
- UUIDv8を新規採番に用いることは推奨されません。
- 弱いPRNGによるUUID自作はUUIDの衝突の原因になることがあります。
- 生成器の状態はUUIDの衝突の原因になることがあります。
- UUIDv3/v5はUUIDの衝突の原因になることがあります。
- カウンタの桁あふれはUUIDの衝突の原因になることがあります。
- 時刻の巻き戻りはUUIDの衝突の原因になることがあります。
- UUIDの切り詰めはUUIDの衝突の原因になることがあります。
- DB側の一意制約はUUIDの衝突を軽減します。
- fork後の再seedはUUIDの衝突を軽減します。
- CSPRNGは弱いPRNGによるUUID自作を防ぎます。
- UUIDv7は単調性を利用します。
- カウンタの桁あふれは単調性と両立しません。
- 時刻の巻き戻りは単調性と両立しません。
- UUIDv3/v5はnamespaceを利用します。
- UUIDv3/v5は正規化を前提とします。
- UUIDv4はRFC 9562で確認できます。
- UUIDv7はRFC 9562で確認できます。
- UUIDv3/v5はRFC 9562で確認できます。
- UUIDv8はRFC 9562で確認できます。
- UUIDv1/v6はRFC 9562で確認できます。
- UUIDv1/v6はUUIDの衝突の原因になることがあります。
- UUIDはRFC 9562で確認できます。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。