Neden '397' ReSharper GetHashCode geçersiz kılma için kullanılıyor?


150

Birçoğunuz gibi, geliştirme sürecini hızlandırmak için ReSharper kullanıyorum. Bir sınıfın eşitlik üyelerini geçersiz kılmak için kullandığınızda, GetHashCode () için ürettiği kod-gen şöyle görünür:

    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;
        }
    }

Tabii ki orada bazı üyelerim var, ama bilmek istediğim şey neden 397?

  • EDIT: Benim sorum daha iyi ifade olurdu, bunun dışında 397 asal sayı ile asal sayı olmak 'özel' bir şey var mı?

Yanıtlar:


166

Muhtemelen 397, sonuç değişkeninin taşmasına ve hash bitlerini bir şekilde karıştırmasına ve hash kodlarının daha iyi dağıtılmasına neden olmak için yeterli büyüklükte olduğundan. 397 hakkında, onu aynı büyüklükteki diğer primerlerden ayıran özel bir şey yoktur.


73
Ve 397 mutlu. Hepimiz sadece mutlu olmak istemiyor muyuz?
Russell B

2
Tamam, ama neden asal olmalı ve neden bu büyüklükte olmalı? Asal olması gerekiyorsa, neden 2 veya 2147483647 olmasın? Sanırım güzel bir mutasyon (ve bu çarpmanın tek nedeni mutasyon) almak için asal sayıya ihtiyacımız yok. Tercihen açık kalıplar olmadan göreceli olarak aynı sayı veya sıfırlara ve sayılara sahip olmak için çarpanlara ihtiyacımız var. 397 = 110001101b uyumludur. Büyüklüğünden hala emin değilim.
Andriy K

5
Nick'in dediği gibi, bu konuda özel bir şey yok. Bu boyutta olması gerekmiyor, bu sadece bir hash hesaplarken sonucun taşmasına neden olacak kadar büyük bir sayı (GetHashCode () bir Int32 döndürdüğü için). Bir asal seçmek sadece dağıtım için yararlıdır, matematik derecem yok, bu yüzden denemeye ve açıklamayacağım, ancak bir asal ile çarpma, diğer herhangi bir rasgele sayı ile çarpmadan daha iyi dağıtılmış bir sonuca sahip olacak.
Ben Randall

16

Yeniden birleştiricinin kullandığı karma , FNV karma değerinin bir varyantı gibi görünür . FNV sıklıkla farklı primerlerle uygulanır. Burada FNV için uygun prim seçimi konusunda bir tartışma var .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.