1

NSObject 协议参考说“如果两个对象相等,它们必须具有相同的哈希值。”

为什么一定要?两个相等的对象没有相同的哈希值可能是什么问题?

4

2 回答 2

7

基本上,您将无法在哈希表中查找相等的值。哈希码基本上用作在哈希表(或哈希集)中查找潜在键匹配的快速方法。这依赖于“对象相等意味着哈希相等”合同。

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

于 2012-05-22T15:32:09.427 回答
2

这是哈希表如何工作的简化描述。NSSet 是一个哈希表。

基本结构

分配一个由 N 个 NSMutableArrays 组成的 NSArray。我们称外部数组为“table”,内部数组为“lists”。这个结构就是我们的哈希表。

插入的工作原理

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

查找的工作原理

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


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

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

于 2012-05-22T17:22:01.160 回答