UUIDの解説:いつ使うべきか、どのように機能するか
UUIDとは何か、バージョンの違い、衝突リスク、データベースやAPIで安全に生成する方法を解説します。
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を使用しています。時刻順に並べられる文字列としてULIDやSnowflake 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 もご活用ください。