-hash
的文档说明,当可变对象存储在集合中时,它不能更改,并且类似地-isEqual:
的文档说明-hash
值必须与相同对象的值相同。用于在可变可可对象上实现-hash的技巧
鉴于此,是否有人对实施-hash
的最佳方式有任何建议,以使其符合这两个条件,但是实际上是智能计算的(即不仅仅返回0
)?有谁知道框架提供的类的可变版本是如何做到的?
最简单的事情当然就是忘记第一个条件(关于它不会改变),并且确保我在事件集合中不会意外地改变对象,但是我想知道是否有任何解决方案更多灵活。
编辑:我不知道这里是否有可能维持2个合同(其中相等的对象具有相同的哈希值,并且当对象是一个集合的哈希值不改变)当我变异内部对象的状态。我的意思是说“不”,除非我做了一些愚蠢的事情,比如总是为散列返回0,但这就是为什么我要问这个问题。
猜测这是一个老问题,刚刚发现它......但不是可变对象用作通常复制的集合中的键吗?这不就是为了避开这个问题吗? – nielsbot 2012-03-16 03:24:09
@nielsbot:只复制NSDictionaries的密钥。 NSSet不复制它的对象,`CFDictionarySetValue()`API也不复制它的键。 – 2012-03-16 04:29:28
`CFDictionarySetValue`确实会将`kCFTypeDictionaryKeyCallbacks`传递给`CFDictionaryCreate`,否?文档几乎是非感性的......我想一个可变集合obj可以,呃,缓存散列值,这与假设一个集合中的可变obj不会改变它的散列相同,对吧? – nielsbot 2012-03-16 08:36:46