在可变Cocoa对象上实现-hash的技术

Lil*_*ard 12 hash cocoa cocoa-touch objective-c

-hash当一个可变对象存储在一个集合中时,它的文档说不能改变,类似地-isEqual:说,-hash对于相同的对象,值的文档必须相同.

鉴于此,是否有人对最佳实施方式有任何建议-hash,使其满足这两个条件但实际上是智能计算的(即不仅仅是返回0)?有谁知道框架提供的类的可变版本如何做到这一点?

最简单的事情当然是忘记第一个条件(关于它不会改变),并确保我不会在一个集合中偶然改变一个对象,但我想知道是否有任何更灵活的解决方案.

编辑:我想知道在我改变对象的内部状态时是否可以维护2个契约(其中相等的对象具有相等的哈希值,并且当对象在集合中时哈希值不会改变).我倾向于说"不",除非我做了一些愚蠢的事情,总是为哈希返回0,但这就是我问这个问题的原因.

Out*_*mer 3

有趣的问题,但我认为你想要的在逻辑上是不可能的。假设您从 2 个对象 A 和 B 开始。它们都是不同的,并且以不同的哈希码开始。您将两者添加到某个哈希表中。现在,您想要改变 A,但您无法更改哈希码,因为它已经在表中。但是,可以通过 .equals() B 的方式更改 A。

在这种情况下,你有 2 个选择,但都不起作用:

  1. 将 A 的 hashcode 更改为等于 B.hashcode,这违反了哈希表中不更改哈希码的约束。
  2. 不要更改哈希码,在这种情况下 A.equals(B) 但它们没有相同的哈希码。

在我看来,如果不使用常量作为哈希码,就不可能做到这一点。