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

  • jesiel santos

    jesiel santo

    15 Ocak 2009
  • pissengehen

    pissengehen

    26 EYLÜL 2006
  • bored before i even began

    bored before

    30 Mart 2009