使用するUUIDバージョンは?


332

どのバージョンのUUIDを使用する必要がありますか?多くのスレッドが各バージョンに必要なものを説明しているのを見ましたが、どのアプリケーションに最適なのかを理解するのに苦労しています。


2
あなたの選択は何ですか?
Gabe

Pythonで動作するもの。だから私はこのdocs.python.org/2/library/uuid.htmlを推測します。1、3、4、5。
user1802143

バージョン3および5に興味がある場合は、この質問、v5 UUIDの生成を参照してください名前と名前空間とは何ですか?
バジルブルク2017年

回答:


414

UUIDを生成するには、2つの異なる方法があります。

一意のIDだけが必要な場合は、バージョン1またはバージョン4が必要です。

  • バージョン1:ネットワークカードのMACアドレスとタイマーに基づいて一意のIDを生成します。これらのIDは簡単に予測でき(1つを指定すると、別のIDを推測できる場合があります)、ネットワークカードまでさかのぼることができます。これらを作成することはお勧めしません。

  • バージョン4:これらはランダム(または疑似ランダム)番号から生成されます。UUIDを生成する必要があるだけの場合は、おそらくこれで十分です。

特定の名前から常に同じUUIDを生成する必要がある場合は、バージョン3またはバージョン5が必要です。

  • バージョン3:これは、名前空間と名前のMD5​​ハッシュから一意のIDを生成します。(名前からUUIDを生成する別のシステムとの)下位互換性が必要な場合は、これを使用してください。

  • バージョン5:名前空間と名前のSHA-1ハッシュから一意のIDを生成します。これは推奨バージョンです。


17
追加します:reproducible特定の名前からUUID を生成する必要がある場合は、バージョン3またはバージョン5が必要です。そのアルゴリズムに同じ入力をフィードすると、同じ出力が生成されます。
anregen 2014年

3
クラウドコンピューティング環境(AWSやGAEなど)では、バージョン1の弱点が軽減されるように思われます。時間の経過とともに、特定のアプリケーションのUUIDジェネレーターに数千の異なるMACアドレスが適用される可能性が高い場合、予測可能性やトレーサビリティは排除されます。
Buffalo Rabor 2016年

3
@ user239558 UUIDの目標はその一意性であるため、UUIDv5を優先することができます。
エピキュリスト2017

7
バージョン1が「推奨されない」というコメントは、あまりに単純化しすぎています。多くの状況で、これらは確かに問題なく、好ましいです。ただし、信頼できないアクターが利用できる可能性のあるUUIDからこれらの情報項目のいずれかが漏洩するというセキュリティ上の懸念がある場合:(a)UUIDを作成するマシンのMACアドレス、または(b)作成時の日時、次に、バージョン1を避けます。これらの2つの情報が機密情報でない場合は、バージョン1が最適です。
バジルブルク2017年

9
バージョン2はどうなりましたか?
マシューウー

53

乱数が必要な場合は、乱数ライブラリを使用してください。一意の識別子が必要な場合は、実際には0.00 ...多くの0がここにあります... 001%の衝突の可能性がある場合は、UUIDv1を使用する必要があります。NickのUUIDv3およびv5に関する投稿を参照してください。

UUIDv1は安全ではありません。それは意図されたものではありません。それは一意であり、推測不可能ではありません。UUIDv1は、現在のタイムスタンプ、マシン識別子、およびランダムな要素を使用して、そのアルゴリズムによって二度と生成されない数字を作成します。これはトランザクションIDに適しています(全員が数百万のトランザクション/秒を実行している場合でも)。

正直なところ、UUIDv4が存在する理由がわかりません... RFC4122を読む、そのバージョンでは衝突の可能性が排除されていないようです。それは単なる乱数ジェネレータです。それが本当なら、世界で2台のマシンが最終的に同じ「UUID」v4を作成する可能性が非常に高い(U.niversal U.niquenessを保証するメカニズムがないため引用)よりも。そのような状況では、アルゴリズムが、一意の値を生成する方法を説明するRFCに属しているとは思いません。ランダム性の生成に関するRFCに属します。一連の乱数の場合:

chance_of_collision = 1 - (set_size! / (set_size - tries)!) / (set_size ^ tries)

67
あなたはしない限り、2つのUUIDバージョン4の実装は、衝突表示されませんあなたは世紀のための十億のUUID毎秒を生成し、コイントスに勝ちます。覚えておいてください、set_size2 ^ 122は非常に大きいです。
ケビン

8
V4アルゴリズムはシリアルではありません。つまり、v4によって生成された最初の2つのUUIDが一致する可能性があります。多くのオプションがあるからと言って、繰り返しを生成する前に固有のオプションを使い果たす必要があるわけではありません。それはいつでも起こりえます。
anregen 2015

7
あなたは実際に数学をすることに失敗しています。私たちは(種として)毎秒10億のUUIDを生成していません。我々は持っているので、長く(平均で)最初に衝突するまで100年以上。
ケビン

31
V4は衝突する可能性がありますが、確率は非常に低く、ほとんどのユースケースではリスクに見合う価値があります。Re:「結局、同じ世界で2台のマシンが同じ 'UUID'v4を作成する」とはいえ、確かにこれは問題ではありません。なぜなら、UUIDを使用する世界のほとんどのマシンは、異なるコンテキストでそれらを使用するからです。つまり、内部アプリの場合と同じように、自分の内部アプリにも同じUUIDを生成しても問題ありません。衝突は、それらが同じコンテキストで発生する場合にのみ重要です。(アプリ内でも、多くのUUIDはアプリ全体で一意である必要はなく、使用されているコンテキストのみであることに注意してください)

6
あなたはそれを固定して、ラッキーだと思う(または実際に、不運に感じることはありません)必要がある場合は、安全であると使用バージョン1.あなたのGUIDを必要としない場合は、のように聞こえるそれはとても使用バージョン4
Vaccano

16

それは非常に一般的な質問です。1つの答えは、「生成するUUIDの種類によって異なります」です。しかし、より良いものはこれです:「さて、私が答える前に、最新のほとんどのオペレーティングシステムが提供するUUID生成機能を呼び出すのではなく、なぜ独自のUUID生成アルゴリズムをコード化する必要があるのか​​教えていただけますか?」

それを行う方が簡単で安全です。おそらく自分で生成する必要がないので、実装をコーディングする必要ありませんか?その場合、答えは、O / S、プログラミング言語、またはフレームワークが提供するものをすべて使用することになります。たとえば、WindowsにはCoCreateGuidまたはUuidCreateがあります。または使用中の多数のフレームワークから利用できるさまざまなラッパーの1つがあります。Linuxにはuuid_generateがあります

何らかの理由で絶対に自分で生成する必要がある場合は、少なくとも 離れ v1とv2のUUIDを生成するからです。それらを正しくするのは難しいです。代わりに、v3、v4、またはv5のUUIDを使用してください。

更新:コメントで、あなたはPythonを使用していると述べ、これにリンクしています。提供されたインターフェースを見ると、最も簡単なオプションは、を呼び出してv4 UUID(つまり、ランダムデータから作成されたもの)を生成することuuid.uuid4()です。

UUIDを生成するためにハッシュする必要がある(またはできる)データがある場合は、v3(MD5に依存)またはv5(SHA1に依存)を使用できます。v3またはv5 UUIDの生成は簡単です。最初に、生成するUUIDタイプを選択し(おそらくv5を選択する必要があります)、適切な名前空間を選択し、UUIDの生成に使用するデータで関数を呼び出します。たとえば、URLをハッシュする場合は次のようにしますNAMESPACE_URL

uuid.uuid3(uuid.NAMESPACE_URL, 'https://ripple.com')

このUUIDは、次のように生成される同じURLのv5 UUIDとは異なることに注意してください。

uuid.uuid5(uuid.NAMESPACE_URL, 'https://ripple.com')

v3とv5のURLの優れた特性は、実装間で相互運用できることです。換言すれば、2つの異なるシステムは、RFC4122に準拠して、彼らは(または少なくともすること実装を使用する必要があり、他のすべてのものが等しい場合)の両方、すなわち、同じ名前空間とで、同じバージョンのUUIDを生成する(同じUUIDを生成します同じデータ)。このプロパティは状況によっては(特に、コンテンツがアドレス可能なストレージのシナリオで)非常に役立ちますが、特定の状況ではおそらく役に立ちません。


4
OPが質問しなかったためだと思います。「ほとんどの最新のオペレーティングシステムが提供するUUID生成機能を呼び出す代わりに、[自分の] UUID生成アルゴリズムをコード化するにはどうすればよいですか」
anregen 2014年

それはさておき、UUIDv3とv5の良い説明だと思います。v1が良い選択であると私が思う理由について、以下の私の回答を参照してください。
anregen 2014年

NAMESPACE_URLとは それは私が得ることができる変数ですか?どこから?
stackdave 2017年

@stackdave NAMESPACE_URLは、RFC-4122の6ba7b811-9dad-11d1-80b4-00c04fd430c8 30ページで行われた推奨に従って、通常と等しいUUID です。
ジェイミーライディング

2

Postgresのドキュメントでは、の違いについて説明していUUIDます。それらのカップル:

V3:

uuid_generate_v3(namespace uuid, name text) -この関数は、指定された入力名を使用して、指定されたネームスペースにバージョン3のUUIDを生成します。

V4:

uuid_generate_v4 -この関数は、完全に乱数から派生したバージョン4 UUIDを生成します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.