2008-09-19 13 views
124

Birçoğunuz gibi, geliştirme işlemini hızlandırmak için ReSharper'ı kullanıyorum. Orada kendi üyelerinden bazılarına sahip TabiiReSharper GetHashCode için neden '397' kullanılıyor?

public override int GetHashCode() 
    { 
     unchecked 
     { 
      int result = (Key != null ? Key.GetHashCode() : 0); 
      result = (result * 397)^(EditableProperty != null ? EditableProperty.GetHashCode() : 0); 
      result = (result * 397)^ObjectId; 
      return result; 
     } 
    } 

ama ne isteyen pm: Bir sınıfın eşitlik üyelerini geçersiz kılmak için kullandığınız zaman, gibi GetHashCode (için ürettiği kod-gen) görünüyor bilmek neden 397?

  • DÜZENLEME: Öyleyse sorusu daha iyi ifade edilir, çünkü bu sayı dışında 397 asal sayı hakkında 'özel' bir şey var mı?

cevap

134

Muhtemelen 397, sonuç değişkeninin taşmasını ve karma parçanın bir kısmını karıştırmasını sağlamak için yeterli büyüklükte bir başlangıç ​​olduğundan, daha iyi bir karma kod dağılımı sağlar. 397 hakkında, onu aynı büyüklükteki diğer primlerden ayıran özel bir şey yoktur.

+59

Ve 397 mutlu. Hepimiz sadece mutlu olmak istemiyor muyuz? –

+2

Tamam, ama neden asal olmak zorunda ve neden bu büyüklükte olması gerekiyor? Eğer asal olmak zorundaysa, neden 2 veya 2147483647 değil? Güzel mutasyon elde etmek için sanırım (ve bu çarpmanın tek nedeni mutasyon) asal olmak için numaraya ihtiyacımız yok. Tercihen belirgin sayıda desen içermeyen, nispeten aynı sayıda veya sıfır olan ve çarpanı olan çoğaltıcıya ihtiyacımız var. 397 = 110001101b uyumludur. Yine de büyüklük konusunda emin değilim. –

+4

Nick'in dediği gibi, bu konuda özellikle özel bir şey yok. Bu boyutta olması gerekmiyor, bu sadece bir sayıyı hesapladığınız zaman yeterince büyük bir sayıdır (GetHashCode() bir Int32 döndürdüğü için sonuç taşacaktır). Bir asalın seçilmesi sadece dağıtım için yararlıdır, bir matematik derecem yok, bu yüzden denemeye ve açıklamayacağım, ama bir çarpma ile çarpma diğer herhangi bir rasgele sayı ile çarpmadan daha iyi dağıtılmış bir sonuca sahip olacaktır. –

15

Ben'im doğrudur, Meclisi yansıtır, kullanmanın seçtikleri bir asal sayı olduğunu görebilirsiniz.

+8

Hangi montaj? –

+9

asm: "JetBrains.ReSharper.Feature.Services.CSharp" yöntemi: "CSharpEqualityHelper.GenerateGetHashCodeBody" –

6

Yeniden kullanımı sağlayan karma, FNV karma değerinin bir çeşidine benziyor. FNV sıklıkla farklı primerler ile uygulanır. FNV here için uygun seçim primleri hakkında bir tartışma var.

İlgili konular