关于isEqual和hash

时间:2015-04-07 12:04:41

标签: objective-c hash

这个问题与objc中的选择器isEqual有关。

我知道在使用对象isEqual时,他们比较了hash,但是如何理解以下代码:

NSString *string = [NSString stringWithFormat:@"%d", 1];
NSLog(@"%d", [@"1" hash] == [string hash]); // output 1

我读取对象的哈希值不能相同,为什么输出为1?

1 个答案:

答案 0 :(得分:3)

  

我知道在使用对象isEqual时,他们会比较hash

这不正确。 isEqual在不使用hash(通常)的情况下比较对象。

  

我读取对象的哈希值不能相同

同样不正确,对于相等的对象,必须必须,对于不相等的对象,可以相同。由于hash是一个int,因此只有2 ^ 32个可能的值,不足以使每个可能的对象都是唯一的(除非该对象本身等于32位或更少)。

关于hash的唯一规则是:如果[a isEqual:b]为真,则此必须也为真:[a hash] == [b hash]

因此,当你的两个字符串相等时,"1",那么哈希值也应该相等。