我真的必须覆盖哈希只因为我重写isEqual:为我的子类?

Bry*_*hen 5 iphone hash ios

Apple的文档说如果我覆盖,isEqual:那么我必须重写hash以确保两个被认为相等的对象的哈希值应相同isEqual:

然后我读了关于哈希的文档,下面是它的一部分:

因此,散列方法必须不依赖于任何对象的内部状态信息,或者必须确保在对象位于集合中时对象的内部状态信息不会更改.

我的自定义MyClass类有几个成员,其是int和布尔和NSArray中包含MyClass的数量,我想MyClass的两个实例,如果所有成员都是平等是平等的.

我对如何覆盖isEqual:但没有问题hash.在我的理解中,hash应该通过使用诸如XOR或旋转移位之类的位操作来组合成员的散列值来计算散列值.

问题是如何以hash满足Apple在上面提到的要求的方式实施.Docs说哈希值不应该依赖于内部状态(即成员),但我发现我必须使用它们来计算值.

或者甚至我真的需要实现它吗?因为我确定我不会将此类用作NSDictionary的键,这是我知道使用位置的唯一方法hash.有没有其他地方hash使用,我应该关心它?

Jas*_*ien 4

有两个选项 - 要么不依赖内部状态,要么确保当对象位于集合中时内部状态不会更改。

第二个选项将允许您依靠内部状态来生成哈希,但您的对象在集合中时必须是不可变的,以便更改它不会更改其哈希。

Cocoa 中的集合依赖于对象的哈希值来执行诸如containsObject:.

如果您的对象实现依赖于其内部状态的哈希,将其插入到集合中然后进行更改,则其哈希将发生变化,并且集合将失去对该对象的跟踪。