【发布时间】:2010-10-01 08:45:29
【问题描述】:
-hash 的文档说当可变对象存储在集合中时它不能更改,同样-isEqual: 的文档说-hash 的值对于相等的对象必须相同。
鉴于此,是否有人对实现-hash 的最佳方法有任何建议,使其满足这两个条件,但实际上是智能计算的(即不只是返回0)?有人知道框架提供的类的可变版本是如何做到这一点的吗?
最简单的做法当然是忘记第一个条件(关于它不会改变),并确保我不会在集合中意外改变对象,但我想知道是否有任何更灵活的解决方案.
编辑:我想知道当我' m 改变对象的内部状态。我倾向于说“不”,除非我做一些愚蠢的事情,比如总是为哈希返回 0,但这就是我问这个问题的原因。
【问题讨论】:
-
猜这是一个老问题,刚刚发现它......但是在集合中用作键的可变对象不是通常被复制的吗?这不是在回避问题吗?
-
@nielsbot:只复制 NSDictionaries 的键。 NSSet 不会复制它的对象,
CFDictionarySetValue()API 也不会复制它的键。 -
CFDictionarySetValue如果你将kCFTypeDictionaryKeyCallbacks传递给CFDictionaryCreate,不是吗?文档几乎毫无意义......我想一个可变集合 obj 可以,呃,缓存哈希值,这与假设集合中的可变 obj 不会更改其哈希值相同,对吧? -
@nielsbot:
kCFTypeDictionaryKeyCallbacks只保留密钥。-[NSMutableDictionary setObject:forKey:]有点特殊,因为它复制传入的密钥,即使它确实是一个CFMutableDictionaryRef,它有一个不保留密钥的回调。 -
是的..你是对的。我想你可以用复制回调替换保留回调......但也许这很恶心。 ...无论如何.... /我回去工作
标签: objective-c cocoa cocoa-touch hash