c# – 哈希代码作为键控集合中的键

前端之家收集整理的这篇文章主要介绍了c# – 哈希代码作为键控集合中的键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
据我所知,字典被实现为哈希表,其中哈希码用于标识存储桶,然后搜索该存储桶.

在我看来,这意味着对象的哈希码在我的程序的单次运行期间保持稳定(松散地说).

现在,在这里

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

我读

“哈希代码用于在基于哈希表的集合中进行有效插入和查找.哈希代码不是永久值.因此:
[…]
不要使用哈希代码作为从密钥集合中检索对象的密钥.“

任何人都可以向我解释这意味着什么吗?

解决方法

当文档谈到“键控集合”时,它们并不意味着与字典相同.要了解其实际含义,请注意实际上存在KeyedCollection基类: http://msdn.microsoft.com/en-us/library/ms132438%28v=vs.110%29.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 from KeyedCollection<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 from KeyedCollection<int,Employee>. The abstract GetKeyForItem 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的实例,它们具有相同的哈希码但不相等)

猜你在找的C#相关文章