SORU
18 Kasım 2008, Salı


Neden Java'In hashCode() Dize çarpanı olarak 31 kullan?

Java, String bir nesne için hash code olarak hesaplanır

s[0]*31^(n-1) s[1]*31^(n-2) ... s[n-1]

s[i] * * * * int aritmetik, kullanarak ithdizenin karakter, n dize uzunluğunu, ^ üs gösterir.

Neden 31 çarpanı olarak kullanılır?

Çarpan oldukça büyük bir asal sayı olması gerektiğini anlıyorum. Neden 29 ya da 37, ve hatta 97 değil mi?

CEVAP
18 Kasım 2008, Salı


Joshua göre Bloch Effective Java (sürekli sayesinde aldım yeterli ve tavsiye edilecek bir kitap stackoverflow üzerinde söz edilen):

Değeri 31 garip bir başbakan olduğu için seçildi. Hatta ve çarpma taştı, bilgi 2 ile çarpma değişen eşdeğer olarak kaybetmiş olurdu. Bir başbakan kullanmanın avantajı, daha az açıktır, ama bu bir gelenek. 31 güzel bir özellik çarpma kayması ve daha iyi performans için bir çıkarma tarafından değiştirilebilir: 31 * i == (i << 5) - i. Modern VMs optimizasyon bu tür otomatik olarak yapmak.

(Bölüm 3, Madde 9: her Zaman göz ardı eşit olduğunda hashcode, sayfa 48) geçersiz kılar

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • emimusic

    emimusic

    10 Mart 2006
  • Project Mooncircle

    Project Moon

    6 Aralık 2009
  • Samantha Crain

    Samantha Cra

    30 EKİM 2008