どのバージョンのUUIDを使用する必要がありますか?多くのスレッドが各バージョンに必要なものを説明しているのを見ましたが、どのアプリケーションに最適なのかを理解するのに苦労しています。
どのバージョンのUUIDを使用する必要がありますか?多くのスレッドが各バージョンに必要なものを説明しているのを見ましたが、どのアプリケーションに最適なのかを理解するのに苦労しています。
回答:
UUIDを生成するには、2つの異なる方法があります。
一意のIDだけが必要な場合は、バージョン1またはバージョン4が必要です。
バージョン1:ネットワークカードのMACアドレスとタイマーに基づいて一意のIDを生成します。これらのIDは簡単に予測でき(1つを指定すると、別のIDを推測できる場合があります)、ネットワークカードまでさかのぼることができます。これらを作成することはお勧めしません。
バージョン4:これらはランダム(または疑似ランダム)番号から生成されます。UUIDを生成する必要があるだけの場合は、おそらくこれで十分です。
特定の名前から常に同じUUIDを生成する必要がある場合は、バージョン3またはバージョン5が必要です。
バージョン3:これは、名前空間と名前のMD5ハッシュから一意のIDを生成します。(名前からUUIDを生成する別のシステムとの)下位互換性が必要な場合は、これを使用してください。
バージョン5:名前空間と名前のSHA-1ハッシュから一意のIDを生成します。これは推奨バージョンです。
reproducible
特定の名前からUUID を生成する必要がある場合は、バージョン3またはバージョン5が必要です。そのアルゴリズムに同じ入力をフィードすると、同じ出力が生成されます。
乱数が必要な場合は、乱数ライブラリを使用してください。一意の識別子が必要な場合は、実際には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)
set_size
2 ^ 122は非常に大きいです。
それは非常に一般的な質問です。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を生成します同じデータ)。このプロパティは、状況によっては(特に、コンテンツがアドレス可能なストレージのシナリオで)非常に役立ちますが、特定の状況ではおそらく役に立ちません。
NAMESPACE_URL
は、RFC-4122の6ba7b811-9dad-11d1-80b4-00c04fd430c8
30ページで行われた推奨に従って、通常と等しいUUID です。
Postgresのドキュメントでは、の違いについて説明していUUID
ます。それらのカップル:
V3:
uuid_generate_v3(namespace uuid, name text)
-この関数は、指定された入力名を使用して、指定されたネームスペースにバージョン3のUUIDを生成します。
V4:
uuid_generate_v4
-この関数は、完全に乱数から派生したバージョン4 UUIDを生成します。