HashCode對于我這種菜鳥來說,聽過,見過,但是具體是干什么的,我不知道。問度娘,看著大家五花八門的解釋,我蛋疼了,于是今天有空閑就研究下這玩意,看看這玩意到低是干什么的。 在Msdn上對于Hashcode是這樣:用作特定類型的哈希函數。這句話不得不說很抽象,不過還好有備注:GetHashCode方法的默認實現不保證針對不同的對象返回唯一值。 而且,.NET Framework 不保證 GetHashCode 方法的默認實現以及它所返回的值在不同版本的 .NET Framework 中是相同的。 因此,在進行哈希運算時,該方法的默認實現不得用作唯一對象標識符。
好吧,不扯這些理論東西了,大家沒事可以去MSDN看看這個東西,我們用代碼驗證下這玩意。
1,值類型的HashCode分析:
class PRogram { static void Main(string[] args) { int hashCodeA = 0; int hashCodeB = 0; Console.WriteLine("hashCodeA的值和hashCodeB的值相等的情況Hashcode值分別是"); Console.WriteLine(hashCodeA.GetHashCode()+"::::"+hashCodeB.GetHashCode()); hashCodeB = 1; Console.WriteLine("hashCodeA的值和hashCodeB的值不相等的情況Hashcode值分別是"); Console.WriteLine(hashCodeA.GetHashCode() + "::::" + hashCodeB.GetHashCode()); } }
運行的結果:
![LC1YWB}5S`)VE[]~3)R@E6Q LC1YWB}5S`)VE[]~3)R@E6Q](http://s1.VeVb.com/20150728/221903443101543.jpg)
來,小伙伴們,我們來看第二值類型:關于Struct的
public struct StructHashCode//定義一個結構體 { public int a; public int b; }class Program { static void Main(string[] args) { StructHashCode sCode1 = new StructHashCode(); sCode1.a = 1; sCode1.b = 1; StructHashCode sCode2 = new StructHashCode(); sCode2.a = 1; sCode2.b = 1; if (sCode1.GetHashCode() == sCode2.GetHashCode()) Console.WriteLine("我們是相等的哦,親"); else Console.WriteLine("我們是不想等的哦,親"); Console.WriteLine("********華麗分割線***********"); sCode2.a = 1; sCode2.b = 2; if (sCode1.GetHashCode() == sCode2.GetHashCode()) Console.WriteLine("我們是相等的哦,親"); else Console.WriteLine("我們是不想等的哦,親"); Console.WriteLine("********華麗分割線***********"); sCode2.a = 2; sCode2.b = 2; if (sCode1.GetHashCode() == sCode2.GetHashCode()) Console.WriteLine("我們是相等的哦,親"); else Console.WriteLine("我們是不想等的哦,親"); }
}
運行結果:(看到這個結果我想罵娘了)

這兩個關于值類性的例子大家是不是有種困惑的感覺,很抱歉的是,我也不能給大家解釋這是為什么,但是我們最起碼驗證了:HashCode看來是個棧地址是沒什么關系的。希望有大拿幫我解惑。
2,引用類型的HashCode分析:
class Program { static void Main(string[] args) { ClassHashCode classCode1 = new ClassHashCode(); ClassHashCode classCode2 = new ClassHashCode(); ClassHashCode classCode3 = classCode1; Console.WriteLine("classCode1和classCode2的HashCode進行比較"); if (classCode1.GetHashCode() == classCode2.GetHashCode()) Console.WriteLine("我們是相等的哦,親"); else Console.WriteLine("我們是不想等的哦,親"); Console.WriteLine("******華麗的分割線******"); Console.WriteLine("classCode1和classCode3的HashCode進行比較"); if (classCode1.GetHashCode() == classCode3.GetHashCode()) Console.WriteLine("我們是相等的哦,親"); else Console.WriteLine("我們是不想等的哦,親");
}
} public class ClassHashCode {
}
運行的結果:

那么關于classCode1 和classCode2和classCode3之間的關于堆和棧的那點區別,在這我就本給大家敘述了,不懂可以問問度娘。
到這里我想就可以做個總結了:無論是值類型還是引用類型,最終來說都是Object對象,那么對象與對象之間如果相等,HashCode一定是一樣的,如果不想等,HashCode也不一定不一樣(因為有值類型這樣的怪東西)。事情發展到這里大家就多少明白點了吧,HashCode有太多不確定的。以上是個人觀點,希望大拿指正。。
上文提到classCode1和classCode2是不想等的,但是如果我們忽略HashCode不相等(堆和棧的引用地址不等,這時候看來,HashCode好像也和地址有關聯),那么我就可以認為他們是相等的了,大家是不是就想到對象的重復的篩選。
IEqualityComparer<T>就出現啦,他的具體含義大家可以看看MSDN哦 ,具體代碼實現:
class Program { static void Main(string[] args) { UserComparer userCom
新聞熱點
疑難解答