可可.对象相等和散列澄清

And*_*kha 1 collections hash cocoa objective-c

我正在研究Cocoa系列,我的研究带来了Mike Ash 关于对象平等和散列的帖子.

这是帖子的一个例外:

由于hash的语义,如果重写isEqual:那么你必须覆盖hash.如果不这样做,那么您将面临两个相同但没有相同哈希的对象的风险.如果您在字典,集合或使用哈希表的其他东西中使用这些对象,那么就会产生欢闹.

不幸的是,作者没有进一步详细说明欢闹会发生什么,我的好奇心不会让我离开它而不试图深入挖掘.所以问题是:如果我有两个具有不同哈希值的相等对象并将这些对象放入一个集合中,究竟会发生什么?我会遇到什么样的问题?

Wai*_*ain 5

Mike的帖子就是这一节的答案

哈希表基本上是一个带有特殊索引的大数组.将对象放入一个数组中,该数组的索引与其哈希值相对应.散列本质上是从对象属性生成的伪随机数.我们的想法是使索引足够随机,使两个对象不太可能具有相同的哈希值,但它具有完全可重现性.插入对象时,哈希用于确定它的去向.查找对象时,其哈希值用于确定查找位置.

在更正式的术语中,定义对象的散列,使得两个对象在它们相等时具有相同的散列.请注意,反之则不然,并且不能:两个对象可以具有相同的哈希值并且不相等.您希望尽可能地避免这种情况,因为当两个不相等的对象具有相同的哈希值(称为冲突)时,哈希表必须采取特殊措施来处理此问题,这很慢.但是,完全可以避免这种情况是不可能的.

这意味着你将拥有声称是平等的2个物体.您将第一个作为键添加到具有某些值的字典中.然后尝试使用另一个对象作为键来提取该值.它不起作用.应该,因为你的对象是平等的.但是初始哈希查找失败了.

要明确,这可能不会发生.它可能适用于某些对象而对其他对象无效.关键是,如果你没有实现这两种方法,你就不知道会发生什么.