NSObject 协议参考说“如果两个对象相等,它们必须具有相同的哈希值。”
为什么一定要?两个相等的对象没有相同的哈希值可能是什么问题?
NSObject 协议参考说“如果两个对象相等,它们必须具有相同的哈希值。”
为什么一定要?两个相等的对象没有相同的哈希值可能是什么问题?
基本上,您将无法在哈希表中查找相等的值。哈希码基本上用作在哈希表(或哈希集)中查找潜在键匹配的快速方法。这依赖于“对象相等意味着哈希相等”合同。
如果您不打算在使用散列进行快速查找的任何内容中使用您的对象,那么您可能会避免让相等的对象返回不同的散列码 - 但如果可以的话,我真的会避免它。
这是哈希表如何工作的简化描述。NSSet 是一个哈希表。
基本结构
分配一个由 N 个 NSMutableArrays 组成的 NSArray。我们称外部数组为“table”,内部数组为“lists”。这个结构就是我们的哈希表。
插入的工作原理
要插入一个对象,请在其上调用“哈希”。这给了我们一个数字。将数字截断在 0 和 (N - 1) 之间。将该结果视为表中的索引。转到该插槽(列表)处的可变数组,查看“对象”是否已在列表中,如果没有则添加。如果是这样,那就没什么可做的了。
查找的工作原理
要查看某个值是否在哈希表中,请对其调用 hash。这给了我们一个数字。将数字截断在 0 和 (N - 1) 之间。将该结果视为表中的索引。转到该插槽(列表)处的可变数组,并查看“对象”是否已在列表中。如果它在那里,则表包含该对象,否则它不包含。
为什么相等的对象必须具有相等的哈希值?
哈希码用于查找要搜索的列表。如果两个对象在概念上相等但具有不同的哈希值,那么当我们在外部表中进行上述查找时,我们将不会在预期列表中找到该对象,因为我们的对象将解析为两个不同的列表。