🔐

UUIDの標準仕様って何それ

に公開

uuid5って何者ですか

お仕事をしていると見かけたuuid5について調べた忘備録です。

uuid5はUUIDの生成方法

AIで調べても「UUID / RFC 4122 という国際標準仕様です」との回答で、「国際基準をどう活用したものやねん」、と一人でキレ散らかしていました。が、どうやら概念的な話のようです。最終的に「規格」、「方法」という言葉を用いて説明してくれました。

uuidにはバージョンがあった

uuid5 とは、RFC 4122 で定義された「Version 5(Name-based, SHA-1)」という生成ルールのことです。つまり、uuid1, uuid3, uuid4, uuid5 と進化を重ねてきました。Laravelでは

Str::uuid5($namespace, $name);

上記のような形でuuidを関数のように作成できます。
ちなみに他の言語でも似たように書けます。

// python
uuid.uuid5(namespace, name)
// Node.js
uuidv5(name, namespace)
// Go
uuid.NewSHA1(namespace, name)

uuid5の内容

uuid5 は「ネームスペース」と「名前」を組み合わせてハッシュ化する仕組みです。「名前ベース(Name-based)」ともいうらしい。
RFC 4122 ではよく使う固定IDが用意されていて、その中の一つが DNSネームスペースID といいます。

RFC 4122 とは??

UUID(Universally Unique Identifier:全世界で一意な識別子)の標準的な仕様を定めた文書(規格)のこと。

それぞれのuuid

uuid5が名前ベースなのはわかったけど、他のuuidとどう区別して使えばいいのかと思って、各バージョンも調べてみました。
Version 名前 生成方式 現実的な位置づけ
uuid1 Time-based 時刻 + MACアドレス レガシー/非推奨
uuid2 DCE Security uuid1派生 + UID/GID ほぼ使われない
uuid3 Name-based (MD5) 名前 + MD5 互換用途のみ
uuid4 Random 完全ランダム 主流
uuid5 Name-based (SHA-1) 名前 + SHA-1 設計用途で主流

現在主流はuuid4とuuid5

設計的にどう使い分けるべきかというと、uuid4 =「偶然に一意」uuid5 =「意味に基づいて一意」 というのがポイントです。

uuid4が向いているIDの用途

uuid4は完全にランダムで意味のない文字列のIDです。

  • ユーザーID
  • 注文ID
  • セッションID
  • トランザクションID
  • ワンタイムトークン

uuid4の特徴

  • とにかく衝突しない
  • 誰が生成してもOK
  • 再現不能(=追跡不能)

uuid5が向いているIDの用途

uuid5は業務上すでに一意なものに向いています。取り込み直しても必ず同じIDになるため、重複登録を構造的に防げるという特徴があります。

  • 商品コード
  • 外部システムのID → 自システムのID のリレーションなど、外部IDを論理キーとして扱う設計
  • 論理キーの正規化

uuid5の特徴

  • 同じ入力 → 必ず同じUUID
  • 言語が変わっても再現可能
  • システム間連携に強い

一方で、デメリットとしては...
uuid4なら追跡ができない、再現ができない。
uuid5なら予測が用意な分セキュリティ的にこなまれない場合もあります。

結局どっちを使うかというと

このIDは、将来もう一度“同じもの”として再生成したいか?という時...

YES → uuid5
NO → uuid4

上記を心に留めておこうと思います。

こぼれ話

GPTに相談した時にこんな答えも見かけました。

uuid2:DCE Security(ほぼ黒歴史)

uuid1 をベースにして、UID(ユーザーID)GID(グループID)などの OSレベルの識別子 を埋め込みます。が、セキュリティ的に問題が多いし、RFC上は存在するが、実務では見ないんだとか。GPTのワードチョイスが人間臭くて面白い。ちなみにiiud5の前身であるuuid3も暗号学的に非推奨とのことでした。

Discussion