Developer Tools

UUIDの解説:いつ使うべきか、どのように機能するか

UUIDとは何か、バージョンの違い、衝突リスク、データベースやAPIで安全に生成する方法を解説します。

7分で読めます

Server room abstract

UUID(Universally Unique Identifier)は128ビットのラベルで、通常は xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx の形式で表記されます。開発者はUUIDをプライマリキー、相関ID、不透明なトークンとして使用します。中央の調整役なしに生成できるにもかかわらず、衝突が発生する可能性が極めて低いためです。

なぜ整数を使わないのか?

オートインクリメントの整数はシンプルでコンパクトですが、情報が漏洩するリスクがあります。競合他社があなたの注文数を推測したり、IDを連番で試してリソースをスクレイピングしたりできてしまいます。UUIDは実質的に推測不可能であり、URLやクライアントサイドのコードで公開しても安全です。

UUIDはそれ自体がセキュリティ機能ではありません。認可が必要な場合は、引き続きサーバー側で適切に実施してください。

主なUUIDのバージョン

バージョン 生成方法 主な用途
v1 MACアドレス+タイムスタンプ レガシー用途;プライバシーが気になる場合は避ける
v4 ランダムビット 新しいシステムでのデフォルトの選択肢
v5 名前空間+名前のSHA-1ハッシュ 固定入力から決定論的IDを生成

現在ほとんどのアプリケーションでは、プライマリキーにUUID v4を使用しています。時刻順に並べられる文字列としてULIDSnowflake IDを好むチームもありますが、UUIDは依然として最も広くサポートされています。

衝突の確率

v4では、1秒間に数十億件のIDを生成するほどのスケールにならない限り、衝突の確率は天文学的に低い水準にとどまります。通常のWebアプリケーションでは、衝突はあり得ないものとして扱うのが合理的です。ただし、ランダムソースが暗号論的に安全であることが前提です(セキュリティが重要なIDには Math.random() ではなく、OSまたは言語のCSPRNGを使用してください)。

// Browser: prefer crypto.randomUUID() when available
const id = crypto.randomUUID();
console.log(id); // e.g. 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d

実践的なヒント

  • データベースのインデックス:ランダムなUUIDは連番IDに比べてB-treeインデックスを断片化しやすくなります。大規模なスケールで挿入パフォーマンスが重要な場合は、PostgreSQLの gen_random_uuid()、時刻順のUUID v7、またはCOMBスタイルの手法が役立ちます。
  • ログとトレーシング:リクエストごとにUUIDを相関IDとして使用することで、サービスをまたいでログをgrepできるようになります。
  • テスト:フィクスチャでは毎回新しいUUIDを生成することで、テストが固定値に依存しないようにします(再現性が必要な場合はv5またはシード付きジェネレーターが適しています)。

ブラウザで試してみよう

無料の UUID Generator を使えば、v4形式の識別子をすぐに作成できます。サインアップ不要で、すべてブラウザのタブ内でローカルに動作します。

関連するワークフローとして、チェックサムの生成には Hash Generator、APIでUUIDと一緒によく使われるトークンのデバッグには JWT Decoder もご活用ください。