-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