この記事では『UUID』について、
- UUIDとは
- UUIDのバージョン
- UUIDの衝突確率(重複する確率)
などを分かりやすく説明するように心掛けています。ご参考になれば幸いです。
UUIDとは
UUIDはUniversally Unique Identifierの略で、意訳すると「世界中で重複のないユニークなID」です。
UUIDは128ビットの数値であり、この数値を16進数表記するのが一般的です。16進数表記する際には、先頭から4ビットごとに16進数の値(0~F)に変換し、一般的には「8桁-4桁-4桁-4桁-12桁(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)」の形式で表現します。UUIDの例として、「7598AD26-AC12-43CB-1501-A94946170BB8」といった形のIDが考えられます。
補足
- UUIDは「ユーユーアイディー」と読みます。
- UUIDが重複する確率はほぼゼロに等しく、一意である可能性が高いです(後ほど、UUIDが重複する確率について説明します)。
UUIDのバージョン
UUIDには、生成方法によって5つのバージョンが存在します。各バージョンには独自の特徴があり、用途に応じて選ぶことができます。多くの場合、ランダム生成のバージョン4が使用されます。
UUIDのバージョン
- バージョン1(時刻とMACアドレスに基づく)
- 生成時刻とMACアドレスを組み合わせてUUIDを生成します。
- MACアドレスの情報を含むため、プライバシーの懸念から現代のアプリケーションでの使用は推奨されていません。
- バージョン2(DCE Securityに基づく)
- MACアドレスと生成時刻に加えて、POSIXのユーザーIDやグループIDの情報を追加してUUIDを生成します。
- 主にDCE(Distributed Computing Environment)のセキュリティ上の要求から生まれました。
- バージョン3(名前ベースのMD5ハッシュ)
- 名前空間(例: URL, オブジェクト識別子, DNS名)と名前(文字列)からMD5ハッシュを用いてUUIDを生成します。
- MD5は古いハッシュ関数であるため、バージョン3の使用は推奨されていません。
- バージョン4(乱数に基づく)
- 乱数に基づいてUUIDを生成します。
- 最も広く使用されており、特定の情報に依存せずランダムに生成されるため、衝突のリスクが非常に低いです。
- バージョン5(名前ベースのSHA-1ハッシュ)
- 名前空間(例: URL, オブジェクト識別子, DNS名)と名前(文字列)からSHA-1ハッシュを用いてUUIDを生成します。
- バージョン3のような名前ベースのUUIDの生成方法を安全なハッシュ関数であるSHA-1を使用して改良したものです。
また、UUIDを見るとバージョンが分かります。以下の赤字の箇所(UUIDの13番目の文字)がバージョン番号です。
UUIDの形式
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
例えば、「7598AD26-AC12-43CB-1501-A94946170BB8」のUUIDの場合、13番目の文字は「4」なので、このUUIDのバージョンは4です。
UUIDの衝突確率(重複する確率)
UUIDは「世界中で重複のないユニークなID」と説明しましたが、UUIDは基本的にはランダムな値なので、重複する可能性はゼロではありません(限りなくゼロに近い)。
以下に、UUIDの衝突確率を示す極端な事例を紹介します。
UUIDの衝突確率を示す極端な事例
- 約86年間、毎秒10億個のUUIDを生成し続ける(その期間で生成されるUUIDの総数は約270京個)
- その後、1つのUUIDを生成する
- その生成したUUID が過去のUUIDと衝突する確率が50%
このような極端なシチュエーションは現実的でないことから、日常的な使用においてはUUIDの衝突はほとんど考えられないと言えます。
UUIDの衝突確率(重複する確率)の計算
UUIDの衝突確率の計算には、一般的に「誕生日の逆説(誕生日のパラドックス)」に基づくアプローチが用いられます。このアプローチに基づくと、UUIDの衝突確率\(p\)は以下のように近似的に計算できます。
\begin{eqnarray}
p{\;}{\approx}{\;}1-e^{-\frac{n^2}{2m}}
\end{eqnarray}
・\(p\):衝突確率
・\(n\):生成するUUIDの数
・\(m\):UUIDの全通り
・\(e\):自然対数の底(約2.71828)
128ビットで表現できるUUIDの全通りmは「2128」通りあります(バージョン4のUUIDは、6ビットがバージョン情報として固定されているため、実際のランダムなビット数は122ビットとなります。したがって、UUIDの全通りmは「2122」通りとなります)。
ここでは、バージョン4を想定して、mに「2122」を代入し、nに「270京(2.7×1018)」を代入すると、以下に示すように、衝突確率が約50%になります。
\begin{eqnarray}
p{\;}{\approx}{\;}1-e^{-\frac{(2.7×10^{18})^2}{2×2^{122}}}{\;}{\approx}{\;}50{\mathrm{[{\%}]}}
\end{eqnarray}
本記事のまとめ
この記事では『UUID』について、以下の内容を説明しました。
- UUIDとは
- UUIDのバージョン
- UUIDの衝突確率(重複する確率)
お読み頂きありがとうございました。