質問

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を使用してランダムなlongを生成する)ことで、わずかに改善されます。

他のヒント

これはrandomUUIDを使用する最良の例だと思います:

http://www.javapractices.com/topic/TopicAction.do? Id = 56

ランダムな長い値を生成するだけで、すべてのビットがランダムになります。 Java 6では、新しいRandom()はSystem.nanoTime()とカウンターをシードとして使用します。

異なるレベルの一意性があります。

多数のマシンで一意性が必要な場合は、一意のID、または一意のIDのバッチを割り当てるための中央データベーステーブルを作成できます。

1つのアプリで一意性が必要な場合は、カウンター(または要件に応じてcurrentTimeMillis()* 1000またはnanoTime()から開始するカウンター)を使用できます

時間 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();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top