为什么两个相等对象必须具有相同的哈希值?

时间:2012-05-22 15:29:00

标签: objective-c cocoa equality nsobject

NSObject Protocol Reference说“如果两个对象相等,则必须具有相同的哈希值。”

为什么必须? 两个相同的对象没有相同的哈希值会有什么问题?

2 个答案:

答案 0 :(得分:6)

然后,基本上你将无法在哈希表中查找相等的值。散列码基本上用作在散列表(或散列集)中查找潜在键匹配的快速方法。这取决于“对象平等意味着哈希平等”契约。

如果您不打算在使用散列进行快速查找的任何中使用您的对象,那么您可能会让相同的对象返回不同的哈希码 - 但我真的会避免它如果可以的话。

答案 1 :(得分:2)

以下是哈希表的工作原理的简要说明。 NSSet是一个哈希表。

基本结构

分配N NSMutableArrays的NSArray。让我们调用外部数组“table”和内部数组“lists”。这个结构是我们的哈希表。

插入方式如何工作

要插入对象,请在其上调用“hash”。这给了我们一个数字。截断数字在0和(N - 1)之间。将该结果视为表中的索引。转到该槽(列表)的可变数组,看看'对象'是否已经在列表中,如果没有添加它。如果是这样,无事可做。

查找的工作原理

要查看哈希表中是否有值,请在哈希表上调用哈希值。这给了我们一个数字。截断数字在0和(N - 1)之间。将该结果视为表中的索引。转到该槽(列表)的可变数组,看看'object'是否已经在列表中。如果它在那里,表包含对象,否则它不包含。


为什么等对象必须具有相等的哈希值?

哈希码用于查找要搜索的列表。如果两个对象在概念上相等但具有不同的哈希值,那么当我们在外表中查找上面时,我们将无法在预期列表中找到该对象,因为我们的对象将解析为两个不同的列表。