2012-01-19 10 views
8

Aynı dizge için bana aynı karma kodu veren herhangi bir işlev var mı?Bir dize için benzersiz bir sağlama kodu nasıl oluşturabilirim?

2 farklı dize (ancak aynı içeriğe sahip) oluştururken sorun yaşıyorum, bunların kod kodu farklı ve bu nedenle Dictionary'da doğru kullanılmıyor.

işlevinin, anahtar bir dize olduğunda Dictionary işlevinin ne olduğunu bilmek isterim.

public override int GetHashCode() 
{ 
    String str = "Equip" + Equipment.ToString() + "Destiny" + Destiny.ToString(); 
    return str.GetHashCode(); 
} 

Ama aynı olma dize içeriğine rağmen bu kodu kullanan her örneği için farklı sonuçlar üretiyor:

böyle madeni inşa ediyorum.

+5

, hash kodu da aynı olacaktır. – Joey

+1

İçeriğin eşit olduğundan emin misiniz? String.GetHashCode için belgeleme açıkça karma kodları eşit dizeler için aynı olacağını belirtir - http://msdn.microsoft.com/en-us/library/system.string.gethashcode.aspx –

+0

Oldukça eminim String .GetHashCode, programı yeniden başlatırsanız farklı karma değerler döndürür. – Tsabo

cevap

13

Unvanınız Bir kere (benzersiz karma kodları) vücudunuzun farklı bir şey sorar (tutarlı karma kodları) sorar.

Sen iddia: (ama aynı içeriğe sahip) 2 farklı dizeleri oluştururken ben sorun yaşıyorum

, onların karma kodudur farklıdır ve bu yüzden şu bir Dictionary kullanılmaz.

gerçekten aynı içeriğe sahip dizeleri, sadece gerçekleşmeyecek olursa. Teşhislerin bir şekilde yanlış. Bazı bağlamlarda aynı şekilde yazdırabilirsiniz

string text1 = "Hello"; 
string text2 = "Hello\0"; 
İşte

text1 ve text2, ama onlar farklı karma kodları olurdu umut ediyorum: örneğin sizin dizeleri, olmayan yazdırılabilir karakterleri sondaki Unicode "boş" karakter olup olmadığını kontrol edin . karma kodları olduğunu

Not değil benzersiz olması ve orada sadece 2 olası sağlama kodlarının GetHashCode döndü, ama fazla 2 olası farklı dizeleri ... olamaz garantili . her yerde ısrarlı bir hash kodu olmamalı -

Ayrıca aynı içerik hatta aynı yürütülebilir, farklı pistlerinde aynı hash kodu üretme garantisi değil olduğunu unutmayın. Örneğin, 32 bit .NET 4 ve 64 bit .NET 4 CLR'lerin dizeler için farklı karma kodlar ürettiğine inanıyorum. Ancak, değerlerin bir Dictionary'da doğru şekilde depolanmadığı iddianız, bunun tek bir işlem içinde olduğunu belirtir - her şeyin tutarlı olması gerekir.

Açıklamalarda belirtildiği gibi, Equals'u geçersiz kılmanız tamamen olasıdır. Ayrıca, bir karma kod oluşturma yaklaşımınızın mükemmel olmadığını da öneriyorum. Biz Equipment ve Destiny türleridir bilmiyorum, ama böyle bir şey kullanmalısınız öneririm: Genellikle karma kodlar için kullanmak yaklaşımdır

public override int GetHashCode() 
{ 
    int hash = 23; 
    hash = hash * 31 + Equipment.GetHashCode(); 
    hash = hash * 31 + Destiny.GetHashCode(); 
    return hash; 
} 

.Equals sonra gibi görünecektir: dize gerçekten aynı olsaydı

public override bool Equals(object other) 
{ 
    // Reference equality check 
    if (this == other) 
    { 
     return true; 
    }   
    if (other == null) 
    { 
     return false; 
    } 
    // Details of this might change depending on your situation; we'd 
    // need more information 
    if (other.GetType() != GetType()) 
    { 
     return false; 
    } 

    // Adjust for your type... 
    Foo otherFoo = (Foo) other; 

    // You may want to change the equality used here based on the 
    // types of Equipment and Destiny 
    return this.Destiny == otherFoo.Destiny && 
      this.Equipment == otherFoo.Equipment; 
} 
+0

Ekipman ve kader her ikisi de enonlar – RagnaRock

+1

@RagnaRock: Doğru - bu durumda bu iyi olmalıdır. Bu bir sınıfta mı yoksa bir yapıda mı? Ve eğer bir sınıfsa, mühürlenmiş mi? Her iki durumda da, iddia edilen karma uyumsuzluğunu çoğaltabileceğiniziden şüpheliyim. –

+0

problem eşitlik yöntemindeydi, bunu geçersiz kılmak zorunda olmadığımı düşündüm, bir kez yaptığım gibi beklediğim gibi çalıştı – RagnaRock

İlgili konular