web-dev-qa-db-ja.com

どのUUIDバージョンを使用しますか?

どのバージョンのUUIDを使用しますか?各バージョンが何を含んでいるのかを説明しているスレッドがたくさんありましたが、どのアプリケーションに最適なものを見つけ出すのに問題があります。

266
user1802143

UUIDを生成する方法は2つあります。

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

  • バージョン1:ネットワークカードのMACアドレスとタイマーに基づいて固有のIDを生成します。これらのIDは簡単に予測でき(1つあれば、他のものも推測できます)、ネットワークカードまで遡ることができます。これらを作成することはお勧めできません。

  • バージョン4:これらは乱数(または疑似乱数)から生成されます。 UUIDを生成する必要があるだけなら、これはおそらくあなたが望むものです。

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

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

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

323
Gabe

乱数が必要な場合は、乱数ライブラリを使用してください。あなたが実質的に0.00 ...もっと多くの0をここに持っていることでユニークな識別子が欲しいなら...衝突の001%の可能性、あなたはUUIDv1を使用するべきです。 UUIDv3とv5のNickの投稿を見てください。

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)
43
anregen

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

それをすることはより簡単でより安全です、そして、あなたはあなた自身を生成するのにneedをおそらくしないので、なぜ実装をコーディングするのを面倒にしますか?その場合、答えはあなたのO/S、プログラミング言語またはフレームワークが提供するものは何でも使用するようになります。たとえば、Windowsでは、 CoCreateGuid または idCreate 、あるいは使用中の多数のフレームワークから入手できるさまざまなラッパーの1つがあります。 Linuxには id_generate があります。

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

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

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を生成します(または少なくともshould)。 (つまり、同じ名前空間と同じデータを持つ同じバージョンのUUIDを生成します)。このプロパティはsomeの状況(特に連想記憶装置のシナリオ)で非常に役立ちますが、おそらくあなたの特定のケースではそうではありません。

15
Nik Bougalis

PostgresドキュメントUUIDsの違いを説明しています。それらのカップル:

V3:

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

V4:

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

0
Eugen Konkov