回答:
ドキュメントによると、静的メソッドUUID.randomUUID()
はタイプ4 UUIDを生成します。
つまり、一部のタイプ情報には6ビットが使用され、残りの122ビットはランダムに割り当てられます。
6つの非ランダムビットは、UUIDの最上位半分に4つ、最下位半分に2つで配信されます。したがって、UUIDの最上位半分には60ビットのランダム性が含まれています。つまり、衝突を取得するには平均で2 ^ 30のUUIDを生成する必要があります(完全なUUIDの2 ^ 61と比較して)。
だからあなたはかなり安全だと思います。ただし、これは他のタイプのUUIDにはまったく当てはまらないことに注意してください。
ちなみに、UUIDの最下位の半分を使用する(またはSecureRandomを使用してランダムにlongを生成する)ことで、わずかに良い結果が得られます。
Raymond Chenは、これに関して非常に優れたブログ投稿を持っています。
これがrandomUUIDを使用するための最良の例だと思います:
時間YYYYDDDD
(年+日)を接頭辞として使用します。これにより、テーブルとインデックスでのデータベースの断片化が減少します。このメソッドはを返しますbyte[40]
。Active Directory SID(varbinary(85)
)がLDAPユーザーのキーであり、アプリケーションの自動生成されたIDが非LDAPユーザーに使用されるハイブリッド環境で使用しました。また、トランザクションテーブル(銀行業界)の1日あたりの多数のトランザクションはInt
、キーに標準タイプを使用できません。
private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");
public static byte[] getSidWithCalendar() {
Calendar cal = Calendar.getInstance();
String val = String.valueOf(cal.get(Calendar.YEAR));
val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
val += UUID.randomUUID().toString().replaceAll("-", "");
return val.getBytes();
}