Object.GetHashCode Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Varsayılan karma işlevi işlevi görür.
public:
virtual int GetHashCode();
public virtual int GetHashCode();
abstract member GetHashCode : unit -> int
override this.GetHashCode : unit -> int
Public Overridable Function GetHashCode () As Integer
Döndürülenler
Geçerli nesne için karma kod.
Açıklamalar
Bu API hakkında daha fazla bilgi için bkz. Object.GetHashCode için ek API açıklamaları.
Devralanlara Notlar
Karma işlevi, bir nesnenin değerine karşılık gelen bir sayıyı (karma kodu) hızla oluşturmak için kullanılır. Karma işlevler genellikle her türe özeldir ve benzersizlik için giriş olarak örnek alanlarından en az birini kullanmalıdır. Karma kodlar statik alanların değerleri kullanılarak hesaplanmamalıdır.
öğesinden ObjectGetHashCode türetilen sınıflar için yöntemi yalnızca türetilmiş sınıf, başvuru eşitliği olarak eşitlik tanımlarsa temel sınıf GetHashCode() uygulamasına temsilci atayabilir. başvuru türleri için varsayılan uygulaması GetHashCode() , yöntemi tarafından GetHashCode(Object) döndürülene eşdeğer bir karma kodu döndürür. Sabit başvuru türleri için geçersiz kılabilirsiniz GetHashCode() . Genel olarak, değiştirilebilir başvuru türleri için yalnızca şu durumlarda geçersiz kılmalısınız GetHashCode() :
Karma kodu, değiştirilebilir olmayan alanlardan hesaplayabilirsiniz; Veya
Nesne karma kodunu kullanan bir koleksiyonda yer alırken, değiştirilebilir bir nesnenin karma kodunun değişmediğinden emin olabilirsiniz.
Aksi takdirde, karma tabloda değiştirilebilir nesnenin kaybolduğunu düşünebilirsiniz. Değiştirilebilir başvuru türü için geçersiz kılmayı GetHashCode() seçerseniz, belgeleriniz nesne karma tabloda depolanırken sizin türünüzün kullanıcılarının nesne değerlerini değiştirmemesi gerektiğini açıkça belirtmelidir.
Değer türleri için yansıma GetHashCode() kullanan bir varsayılan karma kod uygulaması sağlar. Daha iyi performans için geçersiz kılmayı düşünmelisiniz.
Karma kodları çeşitli yollarla hesaplayan daha fazla bilgi ve örnek için Örnekler bölümüne bakın.
Karma işlevi aşağıdaki özelliklere sahip olmalıdır:
İki nesne eşit olarak karşılaştırırsa, her nesnenin GetHashCode() yöntemi aynı değeri döndürmelidir. Ancak, iki nesne eşit olarak karşılaştırılmazsa, GetHashCode() iki nesnenin yöntemlerinin farklı değerler döndürmesi gerekmez.
GetHashCode() Bir nesnenin yöntemi, nesnenin System.Object.Equals yönteminin dönüş değerini belirleyen nesne durumunda değişiklik yapılmaması durumunda tutarlı olarak aynı karma kodu döndürmelidir. Bunun yalnızca bir uygulamanın geçerli yürütmesi için geçerli olduğunu ve uygulama yeniden çalıştırılırsa farklı bir karma kodun döndürülebileceğini unutmayın.
En iyi performans için karma işlevi, yoğun kümelenmiş giriş de dahil olmak üzere tüm girişler için eşit bir dağıtım oluşturmalıdır. Bunun bir etkisi, nesne durumunda yapılan küçük değişikliklerin en iyi karma tablo performansı için sonuçta elde edilen karma kodda büyük değişikliklere neden olmasıdır.
Karma işlevleri işlem için ucuz olmalıdır.
GetHashCode() yöntemi özel durumlar oluşturmamalıdır.
Örneğin, sınıfı tarafından GetHashCode() sağlanan yönteminin String uygulanması, aynı dize değerleri için aynı karma kodları döndürür. Bu nedenle, aynı dize değerini temsil eden iki String nesne aynı karma kodu döndürür. Ayrıca, giriş belirli aralıklarda kümelenmiş olsa bile yöntem dizedeki tüm karakterleri kullanarak makul bir şekilde rastgele dağıtılmış çıkış oluşturur (örneğin, bir dize 65.535 Unicode karakterden herhangi birini içerebilse bile, birçok kullanıcının yalnızca daha düşük 128 ASCII karakter içeren dizeleri olabilir).
Bir sınıfta iyi bir karma işlevi sağlamak, bu nesneleri karma tablosuna ekleme performansını önemli ölçüde etkileyebilir. Karma işlevinin iyi bir şekilde uygulanmasını sağlayan anahtarlara sahip karma tabloda, öğe aramak sabit zaman alır (örneğin, O(1) işlemi). Karma işlevinin kötü bir uygulamasına sahip karma tabloda, aramanın performansı karma tablodaki öğelerin sayısına (örneğin, karma tablosundaki öğelerin sayısı olan n bir O(n) işlemi) bağlıdır. Kötü amaçlı bir kullanıcı, aşağıdaki koşullar altında karma tablolara bağımlı uygulamaların performansını önemli ölçüde düşürebilen çakışma sayısını artıran veriler giriş yapabilir:
Karma işlevleri sık sık çakışmalar oluşturduğunda.
Karma tablodaki nesnelerin büyük bir kısmı birbirine eşit veya birbirine yaklaşık olarak eşit karma kodları oluşturduğunda.
Kullanıcılar karma kodun hesaplandığı verileri girdiklerinden.
Geçersiz kılan GetHashCode() türetilmiş sınıfların, eşit olarak kabul edilen iki nesnenin aynı karma koda sahip olmasını sağlamak için de geçersiz kılması Equals(Object) gerekir; aksi takdirde, Hashtable tür düzgün çalışmayabilir.