世界でたったひとつの識別子として活用される「UUID」はどのように生成されているのか

世界でたったひとつの識別子として活用される「UUID」はどのように生成されているのか - 画像


オンライン対戦システムやランキングシステムの都合などで「世界中で唯一の値である識別子」をサーバーに接続せずに作成する必要がある場合があり、そうした場合に活用されるのが「UUID」です。そのUUIDの性質について、エンジニアのアリアマン・シャーダさんが解説しています。
Understanding How UUIDs Are Generated - Digital Bunker
https://digitalbunker.dev/2020/09/30/understanding-how-uuids-are-generated/
UUIDは世界中で重複がないユニークな値となるよう設計されており、さらにその一意性が中央サーバーなどの要素に依存しないようになっています。こうした特徴をもつUUIDをデータベースの主キーに利用すると他人のデータベースと結合したり、データを別のデータベースに移動したりすることを自由に行うことが可能になるとのこと。一方、誰でもUUIDを作成できるため、現在世界に存在しているUUIDを追跡できないという欠点も合わせ持っています。
世界中で重複がないユニークな値を実現する方法は多数存在していますが、現代の多くのUUIDの実装はIETFのRFC 4122に基づいており、このRFC 4122では5つの異なる生成方法が定義されています。ここで定義されたUUIDは128ビットのビット列となっており、一般的にはこのビット列を16進数表記して、8-4-4-4-12の形式で表示します。

世界でたったひとつの識別子として活用される「UUID」はどのように生成されているのか - 画像


UUIDがどの形式で生成されたものであるのかは、下図のM・Nの位置にある文字を見れば分かるとのこと。

世界でたったひとつの識別子として活用される「UUID」はどのように生成されているのか - 画像


まず、Nの最初の数ビットで何個の1が連続するかによってUUIDの種類である「バリアント」が決まっています。RFC 4122では1ビット目を「1」、2ビット目を「0」とすることが定められているため、RFC 4122に基づいたUUIDはNの位置が「8」「9」「A」「B」のどれかになることに。
1ビット目2ビット目3ビット目バリアントの種類0  NCSへの後方互換性のための予約10 RFC 4122で規格化110マイクロソフトのGUIDとの後方互換性のための予約111将来の規格のための予約
Mの位置ではバージョンが示されており、この最初の4ビットで5つの生成方法のどれを利用しているのかが分かるとのこと。
1ビット目2ビット目3ビット目4ビット目バージョン詳細00011時刻ベースのUUID00102POSIXのユーザーIDを結合したUUID00113一意な文字列のMD5を元にしたUUID01004ランダム性を元にしたUUID01015一意な文字列のSHA-1を元にしたUUID
現在より一般的に利用されているのはバージョン4の実装で、これは128ビットのうちバージョン・バリアント情報を表す6ビットを除いた122ビットを全てランダムに決めるというもの。完全にランダムに決めるとどこかで重複が発生しそうなものですが、シャーダさんによると重複してしまう危険性は現実にはありえないほど低いとのこと。
例えば100年間ずっと毎秒10億個のUUIDを作成した場合でも重複するUUIDが生成される可能性は約50%で、また、10兆個のUUIDを生成した場合に重複するものが生成される可能性は0.00000006%となっています。とはいえ、これらの計算は「真の乱数」を用いた場合の話で、UUIDの生成に使用する疑似乱数によっては重複する可能性が高くなってしまうとのこと。UUIDの「世界中で重複がないユニークな値」という特徴を守るためには使用する乱数の質に注意を払う必要がありそうです。

ジャンルで探す