gpt4 book ai didi

iphone - 我真的必须重写哈希只是因为我重写了 isEqual : for my subclass?

转载 作者:可可西里 更新时间:2023-11-01 04:42:52 26 4
gpt4 key购买 nike

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

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

Therefore, either the hash method must not rely on any of the object’s internal state information or you must make sure the object’s internal state information does not change while the object is in the collection.

我的自定义类 MyClass 有几个成员,它们是 int 和 bool 以及包含 MyClass 数量的 NSArray,如果所有成员都相等,我希望 MyClass 的两个实例相等。

我对如何覆盖 isEqual: 没有问题,但对于 hash。根据我的理解,hash 应该通过异或或旋转移位等位运算将成员的哈希值组合起来计算哈希值。

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

或者我真的需要实现它吗?因为我确定我不会将此类用作 NSDictionary 的键,这是我知道 hash 在哪里使用的唯一方法。是否还有其他使用 hash 的地方,我应该关心它?

最佳答案

有两个选择 - 要么不依赖内部状态,要么确保当对象在集合中时内部状态不会改变。

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

Cocoa 中的集合依赖于对象的散列来执行方法,例如 containsObject:

如果您的对象实现了一个依赖于其内部状态的散列,将其插入到集合中然后更改,则其散列将更改,并且集合将失去对对象的跟踪。

关于iphone - 我真的必须重写哈希只是因为我重写了 isEqual : for my subclass?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5179124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com