私はRubyのUUIDジェネレーター/パーサーを作成したので、この件については自分自身は十分に知識があると思います。4つの主要なUUIDバージョンがあります。
バージョン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であっても、衝突が発生するずっと前に地球上のすべての生命の絶滅が起こります。
また、2 ^ 64 * 16は256エクサバイトです。同様に、単一のアプリケーションスペースでIDが衝突する可能性が50%になる前に、256エクサバイト相当のIDを保存する必要があります。