hashCode()
Sınıf Boolean yöntemi şöyle uygulanır:
public int hashCode() {
return value ? 1231 : 1237;
}
Neden 1231 ve 1237 kullanıyor? Neden başka bir şey olmasın?
hashCode()
Sınıf Boolean yöntemi şöyle uygulanır:
public int hashCode() {
return value ? 1231 : 1237;
}
Neden 1231 ve 1237 kullanıyor? Neden başka bir şey olmasın?
Yanıtlar:
1231 ve 1237 yalnızca iki (yeterince büyük) keyfi asal sayıdır . Diğer iki büyük asal sayı iyi sonuç verir.
Neden asal?
Bir saniye için kompozit sayıları (asal olmayanlar) seçtiğimizi varsayalım, örneğin 1000 ve 2000. Booleanları bir hash tablosuna eklerken, true ve false , kova 1000 % N
yanıtına 2000 % N
(burada kova N
sayısıdır) gider .
Şimdi dikkat edin
1000 % 8
aynı kova 2000 % 8
1000 % 10
aynı kova 2000 % 10
1000 % 20
aynı kova 2000 % 20
başka bir deyişle, birçok çarpışmaya yol açacaktır .
Bunun nedeni, 1000'in (2 3 , 5 3 ) çarpanlara ayrılması ve 2000'in (2 4 , 5 3 ) çarpanlara ayrılması çok sayıda ortak faktöre sahip olmasıdır. Bu nedenle, kepçe boyutuyla herhangi bir ortak faktöre sahip olma ihtimalleri düşük olduğundan asal sayılar seçilir.
Neden büyük asal sayılar. 2 ve 3 yapmaz mı?
Bileşik nesneler için karma kodlar hesaplanırken, bileşenler için karma kodların eklenmesi yaygındır. Çok sayıda grup içeren bir karma kümede çok küçük değerler kullanılırsa, nesnelerin eşit olmayan bir şekilde dağılması riski vardır.
Çarpışmalar önemli mi? Booleanların zaten iki farklı değeri var mı?
Haritalar, diğer nesnelerle birlikte boole içerebilir. Ayrıca, Drunix tarafından belirtildiği gibi, bileşik nesnelerin karma işlevlerini oluşturmanın yaygın bir yolu, alt bileşenlerin karma kodu uygulamalarını yeniden kullanmaktır; bu durumda, büyük asalları döndürmek iyidir.
İlgili sorular:
2*1231 = 2462
kova gerekir . Böyle bir durumda çarpışmalar sorun olur mu?