メモ

世界でたったひとつの識別子として活用される「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がどの形式で生成されたものであるのかは、下図のM・Nの位置にある文字を見れば分かるとのこと。


まず、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ビット目バージョン詳細
0001

1

時刻ベースのUUID
00102POSIXのユーザーIDを結合したUUID
00113一意な文字列のMD5を元にしたUUID
01004ランダム性を元にしたUUID
01015一意な文字列のSHA-1を元にしたUUID


現在より一般的に利用されているのはバージョン4の実装で、これは128ビットのうちバージョン・バリアント情報を表す6ビットを除いた122ビットを全てランダムに決めるというもの。完全にランダムに決めるとどこかで重複が発生しそうなものですが、シャーダさんによると重複してしまう危険性は現実にはありえないほど低いとのこと。

例えば100年間ずっと毎秒10億個のUUIDを作成した場合でも重複するUUIDが生成される可能性は約50%で、また、10兆個のUUIDを生成した場合に重複するものが生成される可能性は0.00000006%となっています。とはいえ、これらの計算は「真の乱数」を用いた場合の話で、UUIDの生成に使用する疑似乱数によっては重複する可能性が高くなってしまうとのこと。UUIDの「世界中で重複がないユニークな値」という特徴を守るためには使用する乱数の質に注意を払う必要がありそうです。

この記事のタイトルとURLをコピーする

・関連記事
AIが自分好みのアニメ美少女を自動生成してくれる「Waifu Labs」で「俺の嫁」を作ってみた - GIGAZINE

無料でファンタジーな世界観のダンジョンマップを自動生成できる「One Page Dungeon」 - GIGAZINE

スマホのカメラが可能にした秘匿性の高い暗号化通信の実現方法とは? - GIGAZINE

1枚の写真から「存在しないそっくりさん」をAIが自動的に作り出してくれる「Artbreeder」を使ってみた - GIGAZINE

放射性物質を用いて量子乱数を生成してしまう猛者が現れる - GIGAZINE

ランダムな文字列っぽい「ji32k7au4a83」というパスワードが大量のユーザーに使われていた理由とは? - GIGAZINE

in メモ,   ソフトウェア, Posted by log1d_ts

You can read the machine translated English article here.