UUIDのソースを表示
←
UUID
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{Infobox identifier | name = Universally Unique Identifier | image = UEFI variables on Linux screenshot.png | image_size = | image_caption = [[Unified Extensible Firmware Interface|UEFI]]変数として使用されるUUID/GUID | image_alt = | image_border = | acronym = UUID | number = | start_date = <!-- {{Start date|YYYY|MM|DD|df=y}} --> | organisation = {{Plainlist| * [[Open Software Foundation]](OSF) * [[国際標準化機構|ISO]]/[[国際電気標準会議|IEC]] * [[Internet Engineering Task Force]](IETF) }} | digits = 128ビット(数値)<br>36文字(文字列表記) | check_digit = | example = {{code|18cd3748-9a76-4a05-8c69-ba0b8c1a9d17}} | website = {{IETF RFC|9562}}<br>[https://www.iso.org/standard/62795.html ISO/IEC 9834-8:2014] }} '''UUID'''('''Universally Unique Identifier''')や'''汎用一意識別子'''(はんよういちいしきべつし)や'''ユニバーサル一意識別子'''(ユニバーサルいちいしきべつし)は、[[ソフトウェア]]上で[[オブジェクト (プログラミング)|オブジェクト]]を一意に識別するための[[識別子]]である。 UUIDは128[[ビット]]の数値だが、[[十六進法|16進法]]による<code>550e8400-e29b-41d4-a716-446655440000</code>というような文字列による表現も仕様で定められている。 [[分散システム]]上での利用を考慮して設計されており、統制なしに作成しても重複や偶然の一致が事実上起こらないものとして使用できる{{efn|乱数に基づくUUID version 4の場合、2<sup>122</sup>すなわち約5.3{{E|36}}通り存在し、正しく生成されていれば、[[誕生日のパラドックス]]によっても、2つのIDが偶然一致するまでには期待値で2<sup>61</sup>個のIDの生成が必要である。}}。 [[マイクロソフト]]による[[GUID]]は、UUIDの実装の1つとされる。 ==規格== [[:en:Network Computing System|Network Computing System]]で導入され、それを[[Distributed Computing Environment]](DCE)の一部として[[Open Software Foundation]](OSF)が標準化し、「ISO/IEC 11578:1996 "Information technology -- Open Systems Interconnection -- Remote Procedure Call (RPC)"」の一部として文書化されていた。その後、ISOは ISO/IEC 9834-8:2005<ref>{{Cite web |title=ISO/IEC 9834-8:2005 |author= |work=ISO |date= |access-date=17 June 2024 |url= https://www.iso.org/standard/36775.html}}</ref>、ISO/IEC 9834-8:2008<ref>{{Cite web |title=ISO/IEC 9834-8:2008 |author= |work=ISO |date= |access-date=17 June 2024 |url= https://www.iso.org/standard/53416.html}}</ref> 、ISO/IEC 9834-8:2014<ref>{{Cite web |title=ISO/IEC 9834-8:2014 |author= |work=ISO |date= |access-date=17 June 2024 |url= https://www.iso.org/standard/62795.html}}</ref> と改訂した。ISOの仕様は[[Request for Comments|RFC]]を追いかけていて、基本的に同一である。 また[[IETF]]はUUIDに関して2005年7月に{{IETF RFC|4122}}を制定し、2024年5月に{{IETF RFC|9562}}に改訂した。 ==バリアント== UUIDには歴史的経緯から数種類のバリアント(変種)があり、現行の規格で定められているのはそのうちの1つである。16進表記をした場合に<code>xxxxxxxx-xxxx-xxxx-Nxxx-xxxxxxxxxxxx</code>のNの桁の上位ビットがバリアントを示す。RFCでは上位2ビットが10<sub>2</sub>であることが定められているので、16進表記では8、9、A、Bのいずれかとなる。これ以外のバリアントは、RFC制定以前に生成されたUUIDとの[[後方互換性]]、あるいは将来のために予約されている。全てが0のUUIDも、こうしたバリアントの一つである。 {| class="wikitable" ![[最上位ビット|Msb]]0!!Msb1!!Msb2!!バリアント |- |0||<br />||<br />||Network Computing Systemへの後方互換性のために予約 |- |1||0||<br />||RFCやISOで使用しているバリアント |- |1||1||0||マイクロソフトが[[Component Object Model|COM]]で用いている[[GUID]]との後方互換性のために予約 |- |1||1||1||将来のために予約 |} ==バージョン== RFCで定められている仕様には、さらに生成方法が異なる複数の種類があり、これをバージョンと呼んでいる。16進表記をした場合に<code>xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx</code>のMの桁がバージョン(1から8)を示す。なお以降の16進表記でNの桁が小文字になっているのはバリアントの情報が含まれることを示す。 {{IETF RFC|9562}}では、各バージョンに関して、仕様制定時の2024年5月現在として、以下のように問題点を記載している。一般の用途として推奨されるのはバージョン4と7になる。バージョン(4ビット)とバリアント(2ビット)を記載するために合計6ビット消費しているが、UUIDと互換であることが不要であれば、バージョン4の代わりに128ビット乱数を、バージョン7の代わりに[[#ULID|ULID]]<ref name="ulid"/>が使用できる。 {| class="wikitable" |- ! nowrap | バージョン ! 問題点 |- | 1 || 色々と問題があるため、可能ならバージョン7を使用すべき(SHOULD)。 |- | 2 || [[Distributed Computing Environment|DCE]]用なのでRFCの対象外。 |- | 3 || [[MD5]]を使用しているが、MD5は脆弱なので、他のを使うべき(SHOULD)。 |- | 4 || 問題なし。乱数のみによる生成。 |- | 5 || [[SHA-1]]を使用しているが、SHA-1は脆弱で、NISTは2030年12月31日に仕様を廃止予定<ref>{{cite web |url=https://www.nist.gov/news-events/news/2022/12/nist-retires-sha-1-cryptographic-algorithm |title=NIST Retires SHA-1 Cryptographic Algorithm |date= |author= |accessdate= June 15, 2024}}</ref>。代わりに[[SHA-2]]を使用する場合は、バージョン8とすること(MUST)。 |- | 6 || バージョン1と互換性を保ちながら、時間順でソートできるようにしたものだが、バージョン7を使用するべき(SHOULD)。 |- | 7 || 問題なし。先頭にミリ秒単位の時刻を付けて、時間順でソートできるもの。 |- | 8 || 実験用。 |} ===バージョン1=== もともとの生成法である、時刻と[[MACアドレス]]を利用したUUID。16進表記をすると<code>TTTTTTTT-TTTT-1TTT-sSSS-AAAAAAAAAAAA</code>のような構造になっており、それぞれタイムスタンプ(T:60ビット)、クロックシーケンス(S:14ビット+上位2ビットが10<sub>2</sub>)、ノード(A:48ビット)からなる。 タイムスタンプはUUID生成時刻([[協定世界時]])における1582年10月15日([[カトリック教会]]における[[グレゴリオ暦]]の実施日)0時0分からの経過時間を100ナノ秒単位で計測した数値。60ビットで3653年分の時刻を扱えるため、西暦5235年までこの方法を用いることができる。 ノードはUUIDを生成した装置を一意に示す値で、普通はネットワークカードに(通常一意に)与えられている[[MACアドレス]]を用いる。複数あるときは任意に一つを選択してよい。またMACアドレスが存在しない場合には、乱数を生成してマルチキャストビットを立てて用いることができる。 クロックシーケンスは、同一の機器で(同一のネットワークインタフェース(MACアドレス)を持ち)、かつ、時計の精度などのために同一のタイムスタンプにおいてUUIDを生成しなければならない場合に、同一のUUIDが重複しないように順次変更させて使う値である。この値はインクリメントなどで変更しなければならず、乱数列を使用してはならない。14ビットしかないので、乱数列では[[誕生日のパラドックス|誕生日パラドックス]]により容易に同一のUUIDを生成し得るからである。 また、機器の時刻管理や[[うるう秒]]による時刻の巻き戻りのために、あるいは、時刻が進んでいる装置から遅れている装置にネットワークカードを移設したような場合にも重複が発生し得る。前者への対応として、クロックシーケンスは新しいタイムスタンプの度にリセットしたりせず、最後に生成した時の状態を保持し、継続して更新しなければならない。しかし、後者への対応は、前にそのカードを使っていた装置で生成されたクロックシーケンスを知ることは難しいため、乱数で再初期化せざるを得ない。 バージョン1のUUIDの特徴として、同じ装置で生成された事実やUUID生成の前後関係を知ることができる。しかし、MACアドレスは人為的に差し替え可能であり、必ずしもあてにはできない。 {{IETF RFC|9562}}ではバージョン1よりもバージョン7を使うべき(SHOULD)としている。 ===バージョン2=== [[Distributed Computing Environment|DCE]]システムにおける権限[[認可 (セキュリティ)|認可]]を目的に設計されたもので、バージョン1のUUIDの一部を、[[POSIX]]のユーザーIDやグループIDで差し替えたもの。16進表記では<code>IIIIIIII-TTTT-2TTT-dDDD-AAAAAAAAAAAA</code>となり、タイムスタンプの一部とクロックシーケンスをそれぞれローカルID(I:32ビット)とローカルドメイン(D:14ビット+上位2ビットが10<sub>2</sub>)で置き換えている。ローカルドメインはローカルIDの種類を示す値で、ユーザーIDを用いる場合には0(16進表記で8000)、グループIDを用いる場合には1(16進表記で8001)となる<ref>{{cite web| author = The Open Group| year = 1997 | title = DCE 1.1: Authentication and Security Services | url = http://www.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01 | accessdate = 2016-05-17}}</ref>。 ===バージョン3/5=== ドメイン名などなんらかの一意な名前(バイト列)を用いたUUIDで、ハッシュ関数として[[MD5]](バージョン3)または[[SHA-1]](バージョン5)を利用したもの。すでに一意であることがわかっている物があり、それと(事実上)1対1に対応するUUIDが必要な場合に用いられる。16進表記では<code>HHHHHHHH-HHHH-3HHH-hHHH-HHHHHHHHHHHH</code>、<code>HHHHHHHH-HHHH-5HHH-hHHH-HHHHHHHHHHHH</code>となり、そのほとんどがハッシュ値に由来する(H:122ビット)。用いる名前は[[Fully Qualified Domain Name|FQDN]]、[[Uniform Resource Locator|URL]]、[[X.500]] DNなど何でもよいが、それぞれの名前空間自体に固有のUUIDが割り当てられている必要がある。名前空間のUUID(バイト列)と名前を繋げてハッシュ値を計算し、それを名前のUUIDへと変換する。MD5の場合の変換は、128ビットのハッシュ値にバリアント (10<sub>2</sub>) とバージョン (0011<sub>2</sub>) を上書きする。SHA-1は160ビットのハッシュだが、下位32ビットを切り捨て128ビットにした上で、同様にバリアント (10<sub>2</sub>) とバージョン (0101<sub>2</sub>) を上書きすることで変換する。 ===バージョン4=== バージョン4のUUIDは、乱数により生成される。他のUUIDと同様、バージョン4であることを示すために4ビットが使われ、バリアント(バリアント1と2に対して、それぞれ10<sub>2</sub>または110<sub>2</sub>)を示すために2または3ビットが使われる。したがって、バリアント1(つまりほとんどのUUID)では、ランダムなバージョン4のUUIDの場合、6ビットはバリアントとバージョンビットのためにあらかじめ決定されており、ランダムに生成される部分には122ビットが残されている。よって、バージョン4バリアント1のUUIDは、2<sup>122</sup>すなわち約5.3{{e|36}}通り存在する{{efn|<math>2^{122}=5,316,911,983,139,663,491,615,228,241,121,378,304</math>}}{{efn|5.3[[澗]]、5.3 undecillionとも。[[命数法]]および[[:en:Names of large numbers]]も参照のこと。}}。16進表記では、<code>RRRRRRRR-RRRR-4RRR-rRRR-RRRRRRRRRRRR</code>となる。バージョン4バリアント2のUUID(レガシーなGUID)の場合、バリアントに3ビットが確保されるため、UUIDの総数は半分になる。 ===バージョン6=== バージョン1の改変で、time_low, time_mid, time_high の順番を逆にして、time_highが上位ビットに来るようにして、時間順でソートできるようにして、データベースでの局所性を高められる。古いバージョン1との互換性が不要であれば、{{IETF RFC|9562}}はバージョン6ではなくバージョン7を使うべき(SHOULD)としている。 ===バージョン7=== バージョン7はバージョン6と同様に時間順でソート可能で、ミリ秒単位の[[UNIX時間]]を先頭48ビットに付けている。それにより、時刻が近いデータをまとめられるので、データベースのプライマリキーとして使用した場合、局所性を高められる。16進表記では、<code>TTTTTTTT-TTTT-7RRR-rRRR-RRRRRRRRRRRR</code>となる。 128ビットの構成 # ミリ秒単位のUNIX時間を48ビット。10889年まで表現可能。 # バージョン。定数0111<sub>2</sub> # 乱数12ビット # バリアント。定数10<sub>2</sub> # 乱数62ビット ===バージョン8=== 実験もしくはベンダー固有の用途用。バージョンとバリアント以外の部分は自由に使える。 ===バージョン9から15=== 将来の使用のために予約。 == {{Visible anchor|ULID}} == UUID から派生した類似のものとして ULID (Universally Unique Lexicographically Sortable Identifier) がある。内容としてはUUIDバージョン7と近く(ULIDの方が古く{{IETF RFC|9562}}では参考にしたものの1つとして記載している)、ミリ秒単位のUNIX時間を48ビット、乱数80ビットから構成される。文字列に変換する際は、CrockfordのBase32を使用し、I, L, O, U は見間違いを防ぐために含めない。文字列表記では26文字になる。<ref name="ulid">{{cite web |url=https://github.com/ulid/spec |title=ulid/spec: The canonical spec for ulid |date= |author= |accessdate= June 15, 2024}}</ref> == 使用例 == 有名な使用例としては、[[ext2]]/[[ext3]]/[[ext4]]ファイルシステムのユーザー空間のツール{{efn|たとえば、[[e2fsprogs]]は{{仮リンク|util-linux|en|util-linux}}が提供する ''libuuid'' を使用している。[[Linux]]のlibuuidは[[GNU Lesser General Public License|LGPLv2]]でライセンスされており<ref>[https://linux.die.net/man/3/libuuid libuuid(3) - Linux man page]</ref>、e2fsprogsパッケージの一部として含まれてもいる<ref>[https://sourceforge.net/p/e2fsprogs/code/ci/master/tree/lib/uuid/ <nowiki>Ext2/Ext3/Ext4 Filesystems Utilities / Code / [fe93a2] /lib/uuid</nowiki>]</ref>。}}、[[LUKS]]暗号パーティション、[[GNOME]]、[[KDE]]、[[macOS]]{{efn|[[Mac OS X 10.4]]に対応するAppleのLibc-391における"gen_uuid.c"を参照のこと<ref>[https://opensource.apple.com/source/Libc/Libc-391/uuid/uuidsrc/gen_uuid.c gen_uuid.c | opensource.apple.com]</ref><ref>[https://opensource.apple.com/source/Libc/Libc-391/uuid/uuidsrc/gen_uuid.c.auto.html gen_uuid.c.auto.html | opensource.apple.com]</ref>。}}などがある。これらのほとんどは、[[セオドア・ツォー]]によるオリジナルの実装に由来する<ref name="e2fsprogs">{{cite web|url=https://git.kernel.org/?p=fs/ext2/e2fsprogs.git;a=blob;f=lib/uuid/gen_uuid.c;hb=1bbfec624c4bbe767060a13762aa9a656536a4fd|title=ext2/e2fsprogs.git - Ext2/3/4 filesystem userspace utilities|website=Kernel.org|accessdate=9 January 2017}}</ref>。 [[Solaris]]では、[[カーネルパニック]]が発生した場合において、[[クラッシュダンプ]]のデータをFault Management Eventと照合 (pairing) する目的で、実行中の[[オペレーティングシステム]]のインスタンスを特定するためにUUIDが使用されている<ref>{{cite web|url=https://blogs.oracle.com/vlad/entry/crashdump_restructuring_in_solaris|title=Crashdump Restructuring in Solaris|website=Blogs.Oracle.com|publisher=[[Oracle Corporation|Oracle]]|accessdate=9 January 2017}}</ref>。 [[Bluetooth Low Energy]]では、GATTサービスやGATTキャラクタリスティックの識別にUUIDを使用する。一部のUUIDは規格によって特定の用途に予約されている。 [[クロスプラットフォーム]]な[[プログラミング言語]]ではUUIDを生成したり文字列と相互変換したりするための機能が標準ライブラリとして用意されていることが多い。 * [[Java]] 1.5以降で実装された java.util.UUID。バージョン3と4が生成可能で、それ以外は外部ライブラリで生成する。<ref>{{Cite web |title=UUID (Java SE 21 & JDK 21) |trans-title= |author= |work=docs.oracle.com |date= |access-date=15 June 2024 |url= https://docs.oracle.com/javase/jp/21/docs/api/java.base/java/util/UUID.html |language=ja}}</ref> * [[Python]] の uuid<ref>{{Cite web |title=uuid --- RFC 4122 に従った UUID オブジェクト |trans-title= |author= |work=Python documentation |date= |access-date=15 June 2024 |url= https://docs.python.org/ja/3/library/uuid.html |language=ja}}</ref> * [[.NET]] の Guid。名前は Guid だが UUID を扱える。<ref>{{cite web |url=https://learn.microsoft.com/ja-jp/dotnet/api/system.guid?view=net-8.0 |title=Guid 構造体 (System) |date= |author= |accessdate= June 15, 2024}}</ref> * [[C++]]では標準化されていないが、[[Boost C++ライブラリ]]には[https://www.boost.org/doc/libs/release/libs/uuid/doc/uuid.html Boost.Uuid]が存在する<ref>[https://boostjp.github.io/tips/uuid.html オブジェクトにユニークなIDを付ける - boostjp]</ref>。 * [[Mac OS X 10.8]]および[[iOS]] 6.0以降は[[Objective-C]]/[[Swift (プログラミング言語)|Swift]]から利用できる<code>UUID</code><ref>{{cite web |url=https://developer.apple.com/documentation/foundation/uuid |title=UUID |date= |author= |accessdate= June 15, 2024}}</ref>および<code>NSUUID</code><ref>[https://developer.apple.com/documentation/foundation/nsuuid NSUUID | Apple Developer Documentation]</ref>クラスが実装されている。Appleの[[Core Foundation]]には<code>CFUUID</code>オブジェクト用の[[Application Programming Interface|API]]が実装されている<ref>[https://developer.apple.com/documentation/corefoundation/cfuuid?language=objc CFUUID | Apple Developer Documentation]</ref>。 [[オペレーティングシステム]]によっては、UUIDを生成するコマンドラインツール<code>uuidgen</code>が用意されていることもある<ref>[https://man7.org/linux/man-pages/man1/uuidgen.1.html uuidgen(1) - Linux manual page]</ref><ref>[https://man.freebsd.org/cgi/man.cgi?uuidgen(1) uuidgen(1) | FreeBSD Manual Pages]</ref>。[[Microsoft Windows]]の場合は[[Windows SDK]]に付属する<ref>[https://learn.microsoft.com/en-us/windows/win32/rpc/generating-the-uuid Generating the UUID - Win32 apps | Microsoft Learn]</ref>。[[Windows API]]における実装については[[GUID]]を参照のこと。 == 脚注 == {{脚注ヘルプ}} === 注釈 === {{notelist}} === 出典 === {{reflist}} == 関連項目 == * [[誕生日攻撃]] * [[オブジェクト識別子|Object identifier]] (OID) * [[Uniform Resource Identifier]] (URI) == 外部リンク == * {{IETF RFC|9562}} - UUIDの仕様 * [https://www.iso.org/standard/62795.html ISO/IEC 9834-8:2014] [[Category:識別子]] [[Category:RFC|4122]]
このページで使用されているテンプレート:
テンプレート:Cite web
(
ソースを閲覧
)
テンプレート:E
(
ソースを閲覧
)
テンプレート:Efn
(
ソースを閲覧
)
テンプレート:IETF RFC
(
ソースを閲覧
)
テンプレート:Infobox identifier
(
ソースを閲覧
)
テンプレート:Notelist
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:Visible anchor
(
ソースを閲覧
)
テンプレート:脚注ヘルプ
(
ソースを閲覧
)
UUID
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報