在我看来,这意味着对象的哈希码在我的程序的单次运行期间保持稳定(松散地说).
现在,在这里
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
我读
“哈希代码用于在基于哈希表的集合中进行有效插入和查找.哈希代码不是永久值.因此:
[…]
不要使用哈希代码作为从密钥集合中检索对象的密钥.“
任何人都可以向我解释这意味着什么吗?
解决方法
关键段落是这样的:
Unlike dictionaries,an element of
KeyedCollection<TKey,TItem>
is not a key/value pair; instead,the entire element is the value and the key is embedded within the value. For example,an element of a collection derived fromKeyedCollection<String,String>
(KeyedCollection(Of String,String)
in Visual Basic) might be “John Doe Jr.” where the value is “John Doe Jr.” and the key is “Doe”; or a collection of employee records containing integer keys could be derived fromKeyedCollection<int,Employee>
. The abstractGetKeyForItem
method extracts the key from the element.
因此,键控集合是一组对象以及从每个对象中提取键的方法.从概念上讲,这类似于数据库中的表,您可以在其中定义主键,该主键是整个记录的子集.
因此,考虑到这一点,答案变得相对清晰.正如其他人所说,哈希码的相等并不意味着对象的相等性.但是,键控集合中的键(如数据库表中的主键)应唯一标识确切的对象.因此,哈希冲突的可能性使它们不适合此目的.
此外,即使在词典中,使用对象作为键并使用相同对象的哈希码作为键也存在重要区别.如果两个对象具有哈希冲突但没有比较相等,则词典仍将它们存储为两个单独的键.这就是为什么重写GetHashCode只返回1总是有效的(虽然显然不利于性能).作为示范:
var dict = new Dictionary<MyClass,string>(); var hashDict = new Dictionary<int,string>(); dict[myObj1] = "One"; hashDict[myObj1.GetHashCode()] = "One"; dict[myObj2] = "Two"; hashDict[myObj2.GetHashCode()] = "Two"; Console.Out.WriteLine(dict[myObj1]); //Outputs "One" Console.Out.WriteLine(hashDict[myObj1.GetHashCode()]); //Outputs "Two"
(myObj1和myObj2是MyClass的实例,它们具有相同的哈希码但不相等)