1. ホーム
  2. architecture

[解決済み] UUIDを使わざるを得ないデザインとは?

2022-07-01 04:46:50

質問

私は UUID . 衝突の確率が 事実上ゼロ であることは知っているが 事実上ゼロ は不可能に近いとさえ言えません。

誰か、UUIDを使うしかないような例をあげてください。 私が見てきたすべての用途から、UUID なしで代替の設計を見ることができます。 確かに設計は若干複雑になるかもしれませんが、少なくとも失敗の確率がゼロでないことは確かです。

UUID は、私にはグローバル変数のような臭いがします。 グローバル変数がよりシンプルな設計にする方法はたくさんありますが、これは単なる怠慢な設計です。

どのように解決するのですか?

私はRubyのUUIDジェネレータ/パーサを書いたので、この件に関してはそれなりに詳しいと自分では思っています。UUIDには4つのメジャーなバージョンがあります。

バージョン 4 の UUID は、基本的に暗号的に安全な乱数生成器から引き出された 16 バイトのランダム性で、UUID のバージョンとバリアントを識別するためにいくつかのビット操作が行われています。これらが衝突する可能性は極めて低いですが、PRNG が使用されている場合や、本当に、本当に、本当に、本当に、本当に運が悪い場合に起こる可能性があります。

バージョン 5 とバージョン 3 の UUID は、それぞれ SHA1 と MD5 ハッシュ関数を使用して、名前空間とすでにユニークなデータの一部を結合して UUID を生成します。これは例えば、URLからUUIDを生成することを可能にする。ここでの衝突は、基礎となるハッシュ関数にも衝突がある場合にのみ発生します。

バージョン 1 の UUID は、最も一般的なものです。ネットワーク カードの MAC アドレス (偽装されていない限り、一意であるべき) とタイムスタンプを使用し、さらに通常のビット操作で UUID を生成します。MACアドレスを持たないマシンの場合、6つのノードバイトは暗号的に安全な乱数発生器を用いて生成されます。タイムスタンプが前のUUIDと一致するほど速く2つのUUIDが連続して生成された場合、タイムスタンプは1だけ増加する。以下のいずれかが発生しない限り、衝突は起こらないはずである。MAC アドレスが偽装されている、2 つの異なる UUID 生成アプリケーションを実行している 1 台のマシンがまったく同じ瞬間に UUID を生成する、ネットワーク カードがない、または MAC アドレスへのユーザー レベルのアクセスがない 2 台のマシンに同じランダム ノードのシーケンスが与えられ、まったく同じ瞬間に UUID を生成する、タイムスタンプを表すバイトが不足してゼロにロールオーバーされた、など。

現実的には、これらのイベントのどれもが、単一のアプリケーションの ID 空間内で偶然に発生することはありません。たとえば、インターネット規模で ID を受け入れている場合や、悪意のある個人が ID 衝突の場合に悪さをするような信頼されていない環境でない限り、心配する必要はありません。もしあなたが私と同じバージョン4のUUIDを偶然にも生成していたとしても、ほとんどの場合、それは問題ではないことを理解しておくことが重要です。私は、あなたとはまったく異なるID空間にIDを生成しました。私のアプリケーションは衝突を知ることはありませんから、衝突は問題ではありません。率直に言って、悪意のあるアクターがいない単一のアプリケーション空間では、たとえバージョン 4 の UUID であっても、たとえ 1 秒間にかなりの数の UUID を生成していたとしても、衝突が起こるずっと前に地球上のすべての生命が絶滅してしまうことでしょう。

また、2^64 * 16 は 256エクサバイトです。つまり、1 つのアプリケーション空間で ID が衝突する確率が 50% になる前に、256エクサバイト分の ID を保存する必要があります。