1. ホーム

[解決済み】JavaでUUIDの最上位ビットを使用した場合の衝突の可能性

2022-04-03 03:09:29

質問

を使用する場合 Long uuid = UUID.randomUUID().getMostSignificantBits() どの程度の確率でコリジョンが発生するのでしょうか。最下位ビットをカットするので、コリジョンに遭遇する可能性はありますよね?

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

によると ドキュメント という静的メソッドがあります。 UUID.randomUUID() はタイプ4のUUIDを生成する。

これは、6ビットが何らかの型情報に使われ、残りの122ビットがランダムに割り当てられることを意味します。

ランダムでない6つのビットは、UUIDの最上位半分に4つ、最下位半分に2つ分散して配置されています。つまり、UUIDの最上位半分には60ビットのランダム性が含まれており、平均して2^30のUUIDを生成しないとコリジョンが発生しないことになります(UUID全体では2^61です)。

だから、むしろ安全だと言えるでしょう。ただし、Carl Seleborgが言及しているように、これは他のタイプのUUIDには絶対に当てはまらないことに注意してください。

ちなみに、UUIDの最下位半分を使用する(またはSecureRandomを使用してランダムな長さを生成する)ことで、少しはマシになるでしょう。