1
3
有意思的问题,但我认为你想要什么在逻辑上是不可能的。假设您从两个对象开始,A和B。它们都是不同的,并且以不同的哈希代码开始。将两者都添加到某个哈希表中。现在,您想要改变一个,但是不能更改哈希代码,因为它已经在表中了。但是,可以更改a,使其等于()b。 在这种情况下,您有两个选择,都不起作用:
在我看来,要做到这一点,不使用常量作为哈希代码是不可能的。 |
2
2
我对文档的理解是可变对象的值
直接引用
NSObject documentation for
(强调我的) |
3
1
这里的问题不是如何满足这两个要求,而是你需要满足哪一个 应该 相遇。在苹果的文档中,明确指出:
也就是说,满足哈希的平等要求似乎更为重要。对象的散列值应该总是一种检查对象是否等于另一个对象的方法。如果不是这样,它就不是真正的哈希函数。
为了完成我的答案,我将给出一个好的哈希实现示例。假设您正在编写
这样,包含相同指针(顺序相同)的两个集合对象将具有相同的哈希。 |
4
0
既然您已经覆盖了-isequal:要进行基于值的比较,您确定需要考虑-hash吗? 当然,我不知道您究竟需要这样做是为了什么,但是如果您希望在不偏离-IsEqual:的预期实现的情况下进行基于值的比较,只在哈希相同时返回Yes,更好的方法可能是模仿nsString的-IsEqualToString:,以便创建自己的-IsEqualToFoo:方法,而不是使用或重写IN-等于: |
5
-1
这个问题的答案和避免许多可可虫的关键是: 仔细阅读文档。把每一个单词和标点都放在一个金色的刻度上,并按它是世界上最后一粒小麦的重量来衡量。 让我们再次阅读文档:
(强调我的)。 文档的作者用他/她永恒的智慧来说,这意味着当你实现一个集合时,比如一本字典,你不应该使用散列来定位,因为这可能会改变。换言之,它与对可变cocoa对象实现-hash几乎没有关系(我们都认为它与此无关,假设文档在过去的10年里没有发生变化,自从被问到这个问题以来)。 这就是为什么字典总是复制它们的键-这样它们就可以保证 哈希值不会改变。 然后你会问这个问题:但是,好的,先生,nsmaptable和类似软件是如何处理这个问题的? 答案根据文件:
(再次强调我的)。 因为上次我们很容易被文档愚弄,所以让我们自己做个小实验,看看这些东西是如何工作的:
惊喜! 因此,它们不使用指针相等,而是关注单词“may”,在本例中这意味着“may not”,并在向集合添加内容时简单地复制散列值。 (所有这些实际上都很好,因为很难实现nshashmap或-hash,否则的话)。 |
6
-2
在爪哇,大多数可变类根本不重写。 Object.hashCode() 这样,默认实现将返回一个基于对象地址且不更改的值。目标C也可能是一样的。 |
Noah H · 如何通过终端或Swift禁用三指轻拍手势? 6 年前 |
Dmitry Serov · 货币数字格式-数字为整数时省略分数部分 6 年前 |
Duny · ObjC日期始终返回2017年12月25日 6 年前 |
Jan Kaiser · NSButton不调用其操作 6 年前 |