データベースの主キーやAPIの識別子として、「f3cb719d-2...」のような文字列を見かけることがあります。これがUUIDです。本記事では、UUIDの仕組みと、よく使われるv4・v7の違いを解説します。
UUID(Universally Unique Identifier)は、128ビットの数値を16進数で表した識別子です。8-4-4-4-12桁の形式でハイフン区切りにするのが一般的です。
f47ac10b-58cc-4372-a567-0e02b2c3d479
連番で採番するIDと違い、複数のサーバーやアプリケーションが同時に値を発行しても、事前の調整なしに重複しない値を作れることが最大の特徴です。
v4のUUIDは、128ビットのうち約122ビットをランダムな値で埋めます。取りうる組み合わせの数は2の122乗という、天文学的な数になります。理論上はまったく同じ値が生成される可能性はゼロではありませんが、実用上は無視できるほど低い確率です。
UUIDにはいくつかのバージョンがあり、先頭16進数1桁でバージョンを識別できます。Web開発でよく使われるのは、v4とv7です。
| バージョン | 生成方法 | 特徴 |
|---|---|---|
| v4 | ほぼ全体がランダム | 予測不可能。ただし生成順の並び替えができない |
| v7 | 先頭48ビットがミリ秒単位のタイムスタンプ、残りがランダム | 生成した順に文字列としてソートできる。データベースのインデックス効率で有利とされる |
v4は「他人に生成順を推測されたくない」場合、v7は「大量のレコードをUUIDのまま時系列で扱いたい」場合に向いています。古いバージョン(v1など)は、端末のMACアドレスを使う方式のため、現在のWebアプリ開発ではあまり使われません。
データベースの主キーに連番(1, 2, 3...)を使うと、件数や増加ペースが外部から推測できてしまいます。UUIDを使えば、IDの値から件数や作成順を読み取られにくくなります。また、複数のシステムでデータを統合する際、連番IDは衝突しますが、UUIDであれば衝突の心配がほとんどありません。
UUIDは、128ビットのランダム性を利用して、事前の調整なしに一意な値を作れる識別子です。順序を気にしないならv4、生成順を保ちたいならv7を選ぶとよいでしょう。
実際の生成はUUID生成ツールから、v4・v7を選んで一括で行えます。