对象哈希码
1,为什么要定义GetHashCode方法
类型定义Equals之所以还要定义GetHashCode,是由于在Hashtable和Dictionary类型以及其他一些集合的实现中,要求对象必须具有相同哈希码才被视为相等。所以,重写Equals就必须重写GetHashCode方法,确保相等性算法和对象哈希码算法一致
2,选择算法来计算类型实例的哈希码时,请遵循以下规则
①这个算法要提供良好的随即分布,使哈希表获得最佳性能
②可在算法中调用基类的GetHashCode方法,并包含它的返回值。但一般不要调用Object或ValueType的GetHashCode方法,因为两者的实现都与高性能哈希算法“不沾边”
③算法至少使用一个实例字段
④理想情况下,算法使用的字段应该不可变;也就是说,字段应在对象构造时初始化,在对象生存期“永不言变”
⑤算法执行速度尽量快
⑥包含相同值得不同对象应返回相同的哈希码。例如,包含相同文本的两个String对象应该返回相同的哈希码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { public class A { private int aaa; public A(int aaaa) { aaa = aaaa; } public string a { get; set; } public override bool Equals(object obj) { return obj.GetType()==GetType(); } public override int GetHashCode() { return aaa; } } class Program { static void Main(string[] args) { var aa = new A(1) {a = "2"}; var aa1 = new A(1) {a = "3"}; Dictionary<A, string> s = new Dictionary<A, string>(); s.Add(aa, "2"); Console.WriteLine(aa.GetHashCode()); Console.WriteLine(aa1.GetHashCode()); //使用不同对象相同hash码能找到字典中的对象 Console.WriteLine(s[aa1]); foreach (var VARIABLE in s) { //Console.WriteLine(VARIABLE.Value); } Console.ReadKey(); } } }
学习永不止境,技术成就梦想。