2010-10-08 24 views

cevap

42

Reflektör göre:

public override int GetHashCode() 
{ 
    return this; 
} 

yapar, mantıklı?

+0

Sanırım. Tüm değer türlerinin ortak bir uygulamaya sahip olacağını düşünüyordum. –

+0

Hayır, her bir Değer türü kendine ait. UInt32 kendisini Int32'ye atar, bu sadece kendisini bir İmzalı Int'a dönüştürür. Int16 ve Int64, 32-Bit Değeri oluşturmak için biraz hareketli geçiş yapar. System.Boolean, durumuna bağlı olarak 0 veya 1 döndürür. –

+3

Interesing, neden sonra int int = 10; 've' int b = 10.GetHashCode(); 'farklı x86 yönergeleri sağlar. Bu tek satırlı yöntemin satır içi olarak belirtileceğini görüyoruz, yani aynı olmalı ama –

-2

32 bit 32 bit değerine sahip olmanın en iyi yolu tekerleği icat etmek değil, değeri kullanmak. Çok hızlı, çarpışma yok, gerçekten mükemmel bir yol.

+3

Evet, ancak bu, bu şekilde uygulandığı anlamına gelmiyor. :) –

+9

Aslında bunu uygulamak için çok kolay bir yoldur. MS başına "En iyi performans için, bir karma işlevi, kümelenmiş girdi de dahil olmak üzere, tüm girdiler için eşit bir dağılım oluşturmalıdır. Bir implikasyon, nesne durumundaki küçük değişikliklerin, en iyi karma tablo için sonuçlanan karma kodunda büyük değişikliklerle sonuçlanması gerektiğidir. performans." (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx) Bu uygulama basitken, hatalı kümelenmeye neden olur ve hashtable tuşları olarak ints kullanıldığında korkunç performansa neden olabilir. –

+10

@JeffWalkerCodeRanger Bu genellikle doğrudur. Ancak çoğu hash tablosu 'hashCode% bucketLength' kullanılarak gerçekleştirilir. Bu nedenle, 0, 1, 2, 3, ... 'nin ortak sırası mükemmel karma kodlara sahip olacaktır. Ancak, girişiniz 0, 32, 64, 96, 128, ... ise, iki kova boyutu dizisi <= 32'nin herhangi biri% 100 karma çarpışmalara sahip olacaktır. MS biraz karıştırmak için değiştirirse,% 100 karma çarpışmalar verecek başka bir dizi olacaktır. Benim düşüncem, Int32 için bir bağlam yoktur ve bağlam olmadan iyi bir karma işlevi yapamazsınız. Verileri toplamanız gerekiyorsa, kendi yazıcınızı yazın. – Aidiakapi

İlgili konular