The hashCode()
metode kelas Boolean diimplementasikan seperti ini:
public int hashCode() {
return value ? 1231 : 1237;
}
Mengapa menggunakan 1231 dan 1237? Mengapa bukan yang lain?
The hashCode()
metode kelas Boolean diimplementasikan seperti ini:
public int hashCode() {
return value ? 1231 : 1237;
}
Mengapa menggunakan 1231 dan 1237? Mengapa bukan yang lain?
Jawaban:
1231 dan 1237 hanyalah dua bilangan prima sembarang (cukup besar) . Dua bilangan prima besar lainnya bisa digunakan.
Mengapa bilangan prima?
Misalkan sejenak kita memilih bilangan komposit (bukan bilangan prima), katakanlah 1000 dan 2000. Saat memasukkan boolean ke dalam tabel hash, true dan false akan masuk ke bucket 1000 % N
resp 2000 % N
(di mana N
jumlah bucket).
Sekarang perhatikan itu
1000 % 8
ember yang sama seperti 2000 % 8
1000 % 10
ember yang sama seperti 2000 % 10
1000 % 20
ember yang sama seperti 2000 % 20
dengan kata lain, akan menyebabkan banyak tabrakan .
Hal ini karena faktorisasi 1000 (2 3 , 5 3 ) dan faktorisasi 2000 (2 4 , 5 3 ) memiliki banyak faktor yang sama. Jadi bilangan prima dipilih, karena tidak mungkin memiliki faktor yang sama dengan ukuran keranjang.
Mengapa bilangan prima besar . Bukankah 2 dan 3 bisa?
Saat menghitung kode hash untuk objek komposit, biasanya kode hash ditambahkan untuk komponen tersebut. Jika nilai yang terlalu kecil digunakan dalam kumpulan hash dengan jumlah bucket yang besar, ada risiko berakhir dengan distribusi objek yang tidak merata.
Apakah tabrakan penting? Boolean hanya memiliki dua nilai yang berbeda?
Peta dapat berisi boolean bersama dengan objek lain. Selain itu, seperti yang ditunjukkan oleh Drunix, cara umum untuk membuat fungsi hash dari objek komposit adalah dengan menggunakan kembali implementasi kode hash subkomponen dalam hal ini adalah baik untuk mengembalikan bilangan prima besar.
Pertanyaan-pertanyaan Terkait:
2*1231 = 2462
ember. Apakah tabrakan menjadi masalah dalam situasi seperti itu?