UUIDとは?
UUIDとは、Universally Unique IDentifierの略です。UUIDはソフトウェアの識別子でオブジェクトを一意に識別できます。UUIDは元来分散システムのオブジェクト識別に用いられていました。
UUIDのメリットはUUID生成時に全体統制や集中管理することなく、生成アルゴリズムを用いるだけで一意のIDを生成できることです。さらに、その処理は非常に高速なため名前の割り当ての競合確率が非常に低いことも特徴です。
UUIDの成り立ち
UUIDは、アポロコンピュータ社(現ヒューレット パッカード エンタープライズ社)がDomain/OSで構成する分散コンピューティングの実装で初めて用いました。
その分散コンピューティングの実装技術NCA(Network Computing Architecture)で使われるNCS(Network Computing System)UUIDは、当時のUnix標準化団体OSF(Open Software Foundation)・現The Open GroupのDCE(Distributed Computing Environment)のDCE UUIDとして継承されました。DCE UUIDは後にRFC 4122として標準規格化され、現在もUUIDとして利用されています。
【参考】:IETF RFC 4122 A Universally Unique IDentifier (UUID) URN Namespace
UUIDのNamespaceとは?
Namespaceとは、ネームスペースまたは名前空間と訳されます。Namespaceは数ある名称の集合体を考えた際に、英字や数字・記号の組み合わせで該当する実体を一意に表します。コンピュータではある命名規則(ルール)を使って名前の識別を行います。
通常その対象範囲が広がると該当する集合体が増加することで、名前の競合が発生する頻度が高まります。そのため、対象データが多いケースやネットワーク環境で識別を一意にするためにUUIDを活用することになります。
UUIDの命名規則
UUIDは128ビットの数値ですが、汎用的に利用するためにURN(Uniform Resource Name)という命名規則にしたがいます。具体的には以下の命名規則で割り当てます。
命名規則:
UUID = A-B-C-DE-F
A:time-low
4バイトの16進表記文字列で、タイムスタンプの下位フィールドを表します。
B:time-mid
2バイトの16進表記文字列で、タイムスタンプの中間フィールドを表します。
C:time-high-and-version
2バイトの16進表記文字列で、タイムスタンプの上位フィールドをバージョン付加した値です。
D:clock-seq-hi-and-reserved
1バイトの16進表記文字列で、クロックシーケンスの上位フィールドをバリアント付加した値です。
E:clock-seq-low
1バイトの16進表記文字列で、クロックシーケンスの下位フィールドを表します。
F:node
6バイトの16進表記文字列で、空間的に一意なノードIDを表します。
このようにUUIDは時間と空間の概念を持っています。通常、空間一意性の確保をするためにネットワークインターフェイスのMACアドレスを利用します。そのため、2つ以上のUUID同時生成のタイミングで時間と空間が完全一致することは現実的には起こり得ず、一意性が保証されています。
さらに生成したUUIDが衝突する確率は128ビットのため、発生確率を考えても衝突の確率は極めて低いと考えられています。
UUIDのバリアントとは?
バリアントとはVariantの日本語で、UUIDの変種を指します。UUIDはもとの実装が1980年代のため、いくつかの種類があります。以下のビット列でバリアントが指定でき、互換性が維持されています。
Msb0 Msb1 Msb2(MsbはMost Significant Bitsの略で、最上位のビット順を表します、xはどちらでも可)
0 x x NCSの互換性確保(予約)
1 0 x RFC4122の使用
1 1 0 Microsoft COMの互換性確保(予約)
1 1 1 将来的な仕様(予約)
このビットはclock-seq-hi-and-reservedフィールドの上位3ビットに記載します。
UUIDのバージョン
UUIDでは生成方法を複数サポートしています。その生成方法をバージョンと呼びます。UUIDのバージョンは以下の指定ビットをtime-high-and-versionフィールドの上位4ビットに記載します。
Msb0 Msb1 Msb2 Msb3 バージョン
0 0 0 1 1 RFC4122のtime-basedバージョン
0 0 1 0 2 DCE Securityバージョン
0 0 1 1 3 RFC4122のname-basedバージョン(MD5ハッシュ)
0 1 0 0 4 RFC4122の乱数使用バージョン
0 1 0 1 5 RFC4122のname-basedバージョン(SHA-1ハッシュ)
GUIDとは?
Windowsの用語としては、UUIDではなくGUIDが用いられています。GUIDとはGlobally Unique Identifierの略です。UUIDのバリアントでもMicrosoft COMが予約されています。そのため、狭義ではGUIDはWindowsのUUIDの実装の1つとされています。
しかし、Oracle DatabaseでもSYS_GUID 関数でGUIDを生成するなど、広義では現在GUIDはUUIDと同一の意味として用いられています。
UUIDは絶対に重複しないのか?
UUIDは絶対に重複しないのでしょうか?正確には、「重複する可能性が極めて低い」というのが正しいでしょう。重複する可能性を表すと、100年間毎秒10億のUUIDを連続で生成したあと、新たに生成した1つのUUIDが過去のものと一致する確率は約50%です。そのため、重複する可能性はほぼないに等しいと言えます。
UUIDの生成と活用方法は?
ここからはUUIDの生成方法と活用方法について説明します。UUIDの生成方法はOSによって操作に違いがありますので、以降で詳しく説明します。
活用方法は、UUIDで一意にオブジェクトを特性できますのでPCといった端末の識別情報として活用したり、ハードディスクの識別情報として活用したり、アプリケーションの制御識別情報として活用したりといった多岐に利用できます。
なおゲームのマインクラフト(マイクラ)でもプレイヤー識別情報が、UUIDとしてMinecraftサーバーで管理されています。アプリケーションレベルの識別情報管理では同じ考え方と言えるものです。
LinuxのUUID生成方法
Linuxでは、ハードディスクの個別パーティションの識別に標準的に利用しています。LinuxのUUID生成方法は、コマンドとしてはuuidgenコマンドを用います。また、”cat /proc/sys/kernel/random/uuid”でUUIDの結果を標準出力に表示することもできます。
プログラムAPIとしてはlibuuidライブラリを用います。APIは、uuid_generate()・uuid_generate_random()・uuid_generate_time()等が用意されています。
WindowsのUUID生成方法
WindowsのUUID(GUID)作成方法は、コマンドの場合はPowerShellのNewGuid()で生成します。Visual Studioをインストールしている場合は、guidgenコマンドが提供されます。
プログラムAPIとしては.NETのNewGuid()が用意されています。
【参考】:Visual Studio: ソフトウェア開発者とチーム向けの IDE およびコード エディター
スマホ(iPhoneやAndroid)のUUID生成方法
スマホのUUID生成方法は、iPhoneやAndroidのOSにより操作が異なります。以下にOS毎のUUID生成方法を紹介します。
・iOSのUUID生成方法
iOSではuuidString関数が用意されています。SwiftのuuidString()やObjective-CのUUIDString()を用いてUUIDを生成します。
【参考】:Apple Developer UUID
・AndroidのUUID生成方法
Androidではストレージ管理でUUIDが用いられています。プログラムAPIはJavaのrandomUUID()や結果をtoString()で文字列に変換して使用します。
スマホ(iPhoneやAndroid)の端末識別子とは?
スマホでは端末の識別情報を端末識別子として管理することがあります。目的は端末自体の個体識別管理と端末に導入したアプリケーションの識別管理を行うことです。スマホの端末識別管理の方法は、iPhoneやAndroidのOSにより操作が異なります。
以下に個体識別の管理方法を紹介します。
・iOS
iOSのUDID(Unique Device IDentifier)は古くからある端末個体識別番号です。このUDIDやMACアドレスはアプリケーション識別としては、現在非推奨のため使用できませんのでidentifierForVendor(IDFV)やAdvertisingIdentifierを利用します。
・Android
AndroidのIMEI・MEID・ESNはAndroid端末個体識別番号です。デベロッパー向けガイドによるとMACアドレスやANDROID_ID等のハードウェアIDを使用しないことが求められています。そのため広告ID(Advertising ID、AAID)で管理することが推奨されています。
【参考】:Android developer 一意の識別子に関するベスト プラクティス
セキュリティ対策でUUIDを活用できる
UUIDは誰でも自由に生成でき、重複することがほぼない一意のものです。また、UUIDは予測されにくいというメリットもあります。このような特長を持ったUUIDを有効的に活用できるのが、セキュリティ対策です。
例えば、システムへのログイン・認証などは特定の端末やアカウントのみに許可されています。システムへのログイン・認証が許可されているかどうかは、端末やアカウントに割り当てられているUUIDで判断することができます。UUIDは重複の可能性が低くユニークなものであるため、偽アカウントやなりすましなどの不正アクセスを防止することも可能です。
UUIDを活用して膨大なオブジェクトを一意に管理しましょう
UUIDは時間的空間的に一意性を保証する識別子となります。UUIDは生成アルゴリズムを用いるだけで一意なIDを生成でき、高速に動作するのが特徴です。UUIDの考え方が理解できたら、ディスクパーティションの管理からアプリケーション開発での利用など多岐に活用できます。
大規模システムで膨大なオブジェクト管理が必要な時に、すぐ活用できるよう事前準備をおすすめします。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから