私は Ruby 用の UUID ジェネレーター/パーサーを作成したので、この件についてかなり詳しいと思います。4 つの主要な UUID バージョンがあります。
バージョン 4 の UUID は、基本的に、UUID のバージョンとバリアントを識別するためのビット操作を伴う、暗号的に安全な乱数ジェネレーターから引き出された 16 バイトのランダム性です。これらが衝突する可能性は非常に低いですが、PRNG が使用されている場合や、本当に、本当に、本当に、本当に、本当に運が悪い場合に発生する可能性があります。
バージョン 5 およびバージョン 3 の UUID は、それぞれ SHA1 および MD5 ハッシュ関数を使用して、名前空間を既に一意のデータの一部と組み合わせて UUID を生成します。これにより、たとえば、URL から UUID を生成できます。ここでの衝突は、基礎となるハッシュ関数にも衝突がある場合にのみ可能です。
バージョン 1 UUID が最も一般的です。それらは、ネットワーク カードの MAC アドレス (スプーフィングされていない限り、一意である必要があります)、タイムスタンプ、および通常のビット操作を使用して UUID を生成します。MAC アドレスを持たないマシンの場合、暗号的に安全な乱数ジェネレーターを使用して 6 ノード バイトが生成されます。タイムスタンプが前の UUID と一致するのに十分な速さで 2 つの UUID が順番に生成された場合、タイムスタンプは 1 増加します。次のいずれかが発生しない限り、衝突は発生しません。2 つの異なる UUID 生成アプリケーションを実行している 1 台のマシンが、まったく同時に UUID を生成します。ネットワーク カードがない、または MAC アドレスへのユーザー レベル アクセスがない 2 台のマシンには、同じランダム ノード シーケンスが与えられ、まったく同時に UUID が生成されます。
現実的には、これらのイベントが 1 つのアプリケーションの ID 空間内で偶然に発生することはありません。たとえば、インターネット全体の規模で ID を受け入れている場合や、ID の競合が発生した場合に悪意のある個人が何か悪いことを行う可能性がある信頼できない環境で ID を受け入れている場合を除き、心配する必要はありません。私と同じバージョン 4 の UUID を生成しても、ほとんどの場合問題にならないことを理解しておくことが重要です。あなたとはまったく異なる ID 空間で ID を生成しました。私のアプリケーションは衝突について決して知らないので、衝突は問題ではありません。率直に言って、悪意のあるアクターのいない単一のアプリケーション空間では、バージョン 4 の UUID でも衝突が発生するずっと前に、地球上のすべての生命が絶滅します。
また、2^64 * 16 は 256 エクサバイトです。1 つのアプリケーション空間で 50% の確率で ID 衝突が発生する前に、256 エクサバイト相当の ID を格納する必要があります。