Kemungkinan tabrakan menggunakan bit paling signifikan dari UUID di Jawa

Jika saya'm menggunakan Panjang uuid = UUID.randomUUID().getMostSignificantBits() berapa besar kemungkinan untuk mendapatkan tabrakan. Ini memotong bit paling signifikan, sehingga ada kemungkinan bahwa anda mengalami tabrakan, kan?

Larutan

Menurut dokumentasi, metode statis UUID.randomUUID() menghasilkan tipe 4 UUID.

Ini berarti bahwa enam bit yang digunakan untuk beberapa jenis informasi dan sisa 122 bit yang ditugaskan secara acak.

Enam non-bit acak didistribusikan dengan empat di paling signifikan setengah dari UUID dan dua di paling signifikan setengah. Jadi yang paling signifikan setengah dari anda UUID berisi 60 bit acak, yang berarti anda rata-rata perlu untuk menghasilkan 2^30 Uuid untuk mendapatkan tabrakan (dibandingkan dengan 2^61 full UUID).

Jadi saya akan mengatakan bahwa anda lebih aman. Catatan, bagaimanapun, bahwa ini adalah benar-benar tidak berlaku untuk jenis lain dari Uuid, seperti Carl Sofer menyebutkan.

Kebetulan, anda akan sedikit lebih baik dengan menggunakan least significant setengah dari UUID (atau hanya menghasilkan acak lama menggunakan SecureRandom).

Komentar (3)

Raymond Chen telah benar-benar baik post di blog ini:

Guid globally unique, tapi substring dari Guid aren't

Komentar (4)

Saya pikir ini adalah contoh terbaik untuk menggunakan randomUUID :

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

Komentar (0)

Anda akan lebih baik hanya menghasilkan acak nilai panjang, maka semua bit acak. Di Java 6, new Random() menggunakan Sistem.nanoTime() plus counter sebagai benih.

Ada tingkat yang berbeda dari keunikan.

Jika anda membutuhkan keunikan di banyak mesin-mesin, anda bisa memiliki central tabel database untuk mengalokasikan id yang unik, atau bahkan batch id yang unik.

Jika anda hanya perlu memiliki keunikan dalam satu aplikasi, anda hanya dapat memiliki sebuah counter (atau counter yang dimulai dari currentTimeMillis()*1000 atau nanoTime() tergantung pada kebutuhan anda)

Komentar (0)

Gunakan Waktu YYYYDDDD (Tahun + Hari Tahun) sebagai awalan. Hal ini akan mengurangi fragmentasi database dalam bentuk tabel dan indeks. Metode ini kembali byte[40]. Aku digunakan dalam sebuah lingkungan hybrid di mana Active Directory SID (varbinary(85)) adalah kunci untuk LDAP pengguna dan aplikasi auto-generated ID digunakan untuk non-Pengguna LDAP. Juga sejumlah besar transaksi per hari di transaksional tabel (Industri Perbankan) tidak menggunakan standar Int jenis Kunci

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();
}
Komentar (1)