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

UUID
type: Concept
definition: 128ビットの識別子で、実装上十分な一意性を提供する一方、真のglobal uniquenessを絶対保証はしない識別子形式のこと。
alternative label: Universally Unique Identifier
verified by: RFC 9562

RFC 9562
type: Concept
definition: UUIDの形式、各version、生成のベストプラクティスを定めるIETFの標準文書のこと。
alternative label: Universally Unique IDentifiers (UUIDs)

CSPRNG
type: Concept
definition: 次の値を予測しにくいことを設計目標に含む、暗号学的に安全な疑似乱数生成器のこと。
alternative label: cryptographically secure PRNG
alternative label: 暗号学的に安全な疑似乱数生成器
recommended for: UUIDv4
prevents: 弱いPRNGによるUUID自作

UUIDv4
type: Concept
definition: version/variantを除く122ビットを乱数で埋める、ランダムベースのUUIDのこと。
alternative label: UUID Version 4
verified by: RFC 9562

弱いPRNGによるUUID自作
type: Concept
definition: 一般用途のPRNGを固定seedなどで回し、UUID形式の文字列を自前で組み立てる実装のこと。
alternative label: 自前実装のUUID
not recommended for: 新規採番

新規採番
type: Concept
definition: 新しいレコードに一意な識別子を新規に割り当てる採番という用途・状況のこと。
alternative label: 新規レコードのID発行

UUIDv3/v5
type: Concept
definition: 同じnamespaceと同じcanonical nameから同じUUIDを再生成する、決定論的なUUIDv3/UUIDv5の総称のこと。
alternative label: name-based UUID
alternative label: 決定論的UUID
not recommended for: 新規採番
uses: namespace
requires: 正規化
verified by: RFC 9562

UUIDv8
type: Concept
definition: 一意性が実装依存であり前提にしてはいけないと定められた、実験用・ベンダー独自用のUUIDのこと。
alternative label: UUID Version 8
not recommended for: 新規採番
verified by: RFC 9562

UUIDの衝突
type: Concept
definition: 本来別々であるべき2つ以上の対象に、同じUUID値が発生・付与されてしまうことのこと。
alternative label: UUIDの重複
alternative label: duplicate key

生成器の状態
type: Concept
definition: 乱数の内部状態、clock sequence、カウンタなど、次のUUIDを決める生成器の状態のこと。
alternative label: generator state

カウンタの桁あふれ
type: Concept
definition: カウンタが最大値を超えて0へ戻ることのこと。
alternative label: counter rollover

時刻の巻き戻り
type: Concept
definition: NTP補正や手動変更で、システム時刻が前の値へ戻ることのこと。
alternative label: clock rollback

UUIDの切り詰め
type: Concept
definition: 先頭数文字だけの利用や64ビット整数への圧縮など、128ビットの一意性の材料そのものを削る変換のこと。
alternative label: 切り詰め
alternative label: prefix比較
may cause: UUIDの衝突

DB側の一意制約
type: Concept
definition: 列や列集合の値がテーブル全体で一意であることを保証する、DB側のUNIQUE/PRIMARY KEY制約のこと。
alternative label: UNIQUE制約
alternative label: PRIMARY KEY制約
mitigates: UUIDの衝突

fork後の再seed
type: Concept
definition: process forkのような状態変化のたびに、CSPRNGの状態を再seedすることのこと。
alternative label: 再初期化
mitigates: UUIDの衝突

UUIDv7
type: Concept
definition: 48ビットのUnixミリ秒タイムスタンプに、乱数やcarefully seeded counterによる74ビットを組み合わせる、時系列ソート可能なUUIDのこと。
alternative label: UUID Version 7
verified by: RFC 9562

単調性
type: Concept
definition: あとから作ったUUIDのほうが必ず大きい値になる性質のこと。
alternative label: monotonicity

namespace
type: Concept
definition: UUIDv3/v5で名前を解釈する文脈を決める、name-based UUID生成に使うほうのUUIDのこと。
alternative label: 名前空間

正規化
type: Concept
definition: 大文字小文字や末尾のスラッシュまで含め、同じ対象を指す文字列を1つの形にそろえる処理のこと。
alternative label: canonicalization

UUIDv1/v6
type: Concept
definition: MACアドレス由来のnodeとclock sequenceを使う時刻系のUUIDのこと。UUIDv6はDB localityの改善のためUUIDv1を並べ替えたもの。
alternative label: 時刻系UUID
alternative label: node/clock sequence based UUID
verified by: RFC 9562

subject: CSPRNG
predicate: recommendedFor
object: UUIDv4
description: UUIDv4はversion/variantを除く122ビットの乱数領域を持ち、RFC 9562はその生成にCSPRNGを使うべきとしている(Section 6.9のSHOULD要件であり、用途によっては例外設計もあり得るとされる)
evidence: section-6.9
evidence: section-5.4
verified at: 2026-08-01
certainty: established

subject: 弱いPRNGによるUUID自作
predicate: notRecommendedFor
object: 新規採番
description: 一般用途PRNGをseed固定などで回してUUID形式の文字列を自作することは、新規採番用途に用いる実装として推奨されない
evidence: section-6.9
verified at: 2026-08-01
certainty: established

subject: UUIDv3/v5
predicate: notRecommendedFor
object: 新規採番
description: UUIDv3/v5は同じnamespaceと同じnameから同じUUIDを再生成する決定論的IDであり、新規採番用途に用いることは推奨されない
evidence: section-6.5
verified at: 2026-08-01
certainty: established

subject: UUIDv8
predicate: notRecommendedFor
object: 新規採番
description: UUIDv8の一意性は実装依存であり前提にしてはいけないため、一意性が必要な新規採番用途に用いることは推奨されない
evidence: section-5.8
verified at: 2026-08-01
certainty: established

subject: 弱いPRNGによるUUID自作
predicate: mayCause
object: UUIDの衝突
description: 同じseedの一般用途PRNGは別プロセスや別ノードでも同じ系列を再現するため、重複を招くことがある
evidence: section-6.9
evidence: uuid.html
verified at: 2026-08-01
certainty: context-dependent

subject: 生成器の状態
predicate: mayCause
object: UUIDの衝突
description: stable storageを持たない実装でVM snapshotやコンテナ複製後に生成器の状態が巻き戻ると、重複が出ることがある
evidence: section-6.3
verified at: 2026-08-01
certainty: context-dependent

subject: UUIDv3/v5
predicate: mayCause
object: UUIDの衝突
description: UUIDv3/v5を毎回新規採番として使うと、同じnamespaceと同じnameから同じUUIDが再生成され重複することがある
evidence: section-6.5
verified at: 2026-08-01
certainty: context-dependent

subject: カウンタの桁あふれ
predicate: mayCause
object: UUIDの衝突
description: UUIDv7で同一ミリ秒内の連番カウンタが桁あふれすると、重複したUUIDが出ることがある
evidence: section-6.2
verified at: 2026-08-01
certainty: context-dependent

subject: 時刻の巻き戻り
predicate: mayCause
object: UUIDの衝突
description: 時刻が戻ったときに何もせず生成を続けると、UUIDv7などの時刻系UUIDで重複が出ることがある
evidence: section-6.2
verified at: 2026-08-01
certainty: context-dependent

subject: UUIDの切り詰め
predicate: mayCause
object: UUIDの衝突
description: 128ビットのうち一意性の材料そのものを削る変換(先頭数文字だけの利用、64ビット整数への圧縮など)は重複を招く
evidence: section-6.7
verified at: 2026-08-01
certainty: established

subject: DB側の一意制約
predicate: mitigates
object: UUIDの衝突
description: UNIQUE/PRIMARY KEY制約は、列や列集合の値がテーブル全体で一意であることを保証し、重複した値の挿入そのものを防ぐ。ただし採番側で重複したUUIDが生成された事実は残るため、衝突そのものを防ぐわけではなく影響を止める仕組みである
evidence: ddl-constraints.html
verified at: 2026-08-01
certainty: established

subject: fork後の再seed
predicate: mitigates
object: UUIDの衝突
description: process forkのような状態変化のたびにCSPRNGの状態を再seedすることで、状態の巻き戻りによる重複を軽減する
evidence: section-6.9
verified at: 2026-08-01
certainty: established

subject: CSPRNG
predicate: prevents
object: 弱いPRNGによるUUID自作
description: OS/ランタイム標準のCSPRNGベースのUUID API(uuid4()など)をそのまま使うことは、一般用途PRNGでのUUID自作を避ける対策になる
evidence: uuid.html
verified at: 2026-08-01
certainty: established

subject: UUIDv7
predicate: uses
object: 単調性
description: 単調性を保つよう正しく設計・実装されたUUIDv7は、rand_aを専用カウンタにする、またはrand_bをランダム初期化カウンタとして使うなどの設計を利用する。counter rolloverやclock rollbackを考慮しない自作実装ではこの保証は成り立たない
evidence: section-6.2
verified at: 2026-08-01
certainty: context-dependent

subject: カウンタの桁あふれ
predicate: incompatibleWith
object: 単調性
description: 桁あふれ時にタイムスタンプを繰り上げるなどの対策をしていない場合、カウンタが0へ戻るとあとから作ったUUIDのほうが必ず大きくなるという単調性が崩れる
evidence: section-6.2
verified at: 2026-08-01
certainty: context-dependent

subject: 時刻の巻き戻り
predicate: incompatibleWith
object: 単調性
description: 時刻が前の値へ戻ったときに何も対策しない場合、あとから作ったUUIDのほうが必ず大きくなるという単調性が崩れる
evidence: section-6.2
verified at: 2026-08-01
certainty: context-dependent

subject: UUIDv3/v5
predicate: uses
object: namespace
description: UUIDv3/v5はnamespaceと呼ばれる文脈用UUIDと、canonical nameの組み合わせから決定論的にUUIDを生成する
evidence: section-6.5
verified at: 2026-08-01
certainty: established

subject: UUIDv3/v5
predicate: requires
object: 正規化
description: 同じcanonical formatのsame nameをsame namespaceで生成したUUIDが常に等しくなるためには、nameのcanonicalizationを仕様として固定することを前提とする
evidence: section-6.5
verified at: 2026-08-01
certainty: established

subject: UUIDv4
predicate: verifiedBy
object: RFC 9562
description: UUIDv4の122ビット乱数領域の仕様はRFC 9562のSection 5.4で確認できる
evidence: section-5.4
verified at: 2026-08-01
certainty: established

subject: UUIDv7
predicate: verifiedBy
object: RFC 9562
description: UUIDv7のtimestampとrandom bits、counterの構成はRFC 9562のSection 5.7で確認できる
evidence: section-5.7
verified at: 2026-08-01
certainty: established

subject: UUIDv3/v5
predicate: verifiedBy
object: RFC 9562
description: UUIDv3/v5のnamespace + canonical nameによる生成規則はRFC 9562のSection 6.5で確認できる
evidence: section-6.5
verified at: 2026-08-01
certainty: established

subject: UUIDv8
predicate: verifiedBy
object: RFC 9562
description: UUIDv8の一意性が実装依存であることはRFC 9562のSection 5.8で確認できる
evidence: section-5.8
verified at: 2026-08-01
certainty: established

subject: UUIDv1/v6
predicate: verifiedBy
object: RFC 9562
description: UUIDv6のnode/clock sequenceやDB locality改善の設計はRFC 9562のSection 5.6で確認できる
evidence: section-5.6
verified at: 2026-08-01
certainty: established

subject: UUIDv1/v6
predicate: mayCause
object: UUIDの衝突
description: 仮想マシンやコンテナの登場でMACアドレスの一意性はもはや保証されず、node IDの複製やclock sequenceの固定値化は重複を招くことがある
evidence: section-6.4
verified at: 2026-08-01
certainty: context-dependent

subject: UUID
predicate: verifiedBy
object: RFC 9562
description: UUIDの形式全体の仕様はRFC 9562で確認できる
evidence: rfc9562
verified at: 2026-08-01
certainty: established