ゆるテックノート

UUIDの小ネタ・実務Tips

基本編の補足として、「衝突の直感」「時系列性のあるIDとの比較」「表記や保存の豆知識」などをまとめました。運用や設計の判断材料にどうぞ。

🎯 衝突確率の直感

誕生日のパラドックスを目安に、ビット長と件数でざっくり判断します。

UUIDv4の目安

生成件数 衝突確率の目安
10^6 件 ほぼ 0
10^9 件 ほぼ 0(理論上は 10^-18 オーダー)
10^12 件 理論上は 10^-12 オーダー。運用ではユニーク制約を併用するのが安全。

運用のヒント

  • 🧠 UUID単体で100%の一意性を保証するわけではない。DBのユニーク制約や整合性チェックを組み合わせる。
  • 🧠 短縮したハッシュやIDを使う場合は、残すビット長に応じて衝突確率が上がる点に注意。

📈 時系列性と類似フォーマット

挿入順やソートのしやすさを重視するときの選択肢です。

比較メモ

形式 特徴 向く用途
UUIDv4 純乱数。推測されにくいが順序性なし。 ランダム性重視のID全般。
UUIDv7(ドラフト) 時刻+乱数でほぼ時系列順。 DBインデックスやログで順序性が欲しい場合。
ULID 時刻+Base32。ソートしやすい、人が読める。 URLキーやログなど人目に触れるID。
KSUID 時刻+160bit乱数。長期的な重複耐性を強化。 時系列性+高い衝突耐性が欲しい場合。

GUIDとの違い

  • ℹ️ GUIDは主にMicrosoft文脈の呼び方で、形式はUUIDとほぼ同じ。
  • ℹ️ 表記揺れ(大文字/小文字、波括弧付き)に注意し、正規形で扱うと混乱を減らせる。

✍️ 表記とエンコードの豆知識

正規化のルールを決めておくと交換が楽になります。

よくあるバリエーション

  • 🔤 ハイフンあり/なし、大文字/小文字。どれかに統一し、I/F仕様に明記する。
  • 🔤 URN形式 `urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` で表す場面もある。
  • 🔤 短縮したい場合はBase32/BASE64URL/Base58にエンコードするが、エンコード方式を揃えること。

保存形式のヒント

  • 💾 DBで速度を重視するならBINARY(16)で保持し、表示時に文字列化する。文字列保存なら小文字+ハイフン付きに揃えると比較しやすい。

🕶️ プライバシーと乱数品質

情報が漏れたり推測されたりするパターンを避けます。

避けたいこと

  • 🚫 v1はMACアドレスや時刻が漏れるため、外部公開IDには不向き。使うならランダムノード対応の実装を選ぶ。
  • 🚫 CSPRNGでない乱数でUUIDを作ると推測・逆引きされやすい。信頼できるライブラリを使う。

🧪 バリデーションと運用

入力を受けるときは形式チェックを強めに。

チェック項目

  • ✔️ 形式だけでなくバージョン(3桁目ブロック先頭の16進1桁)とバリアントを確認する。
  • ✔️ ハイフン有無の揺れは正規化してから保存・比較する。
  • ✔️ URLクエリ等で受け取る場合はエンコードミス(%や+)にも注意。

🛠️ 変換・生成の小ネタ

手元で試すと理解が早まります。

コマンド例

  • 💻 `uuidgen` でv4生成(環境依存でv1のこともある)
  • 💻 `python - <<'PY'\nimport uuid; print(uuid.uuid4())\nPY` で簡易生成
  • 💻 `node -e \"console.log(crypto.randomUUID())\"` でv4生成
  • 💻 ハイフン除去: `uuidgen | tr -d \"-\"`