hash和isEqual

场景:在一次数组过滤删除时,代码逻辑删除了一个对象,但是删完一个对象后,数组元素的个数少了两个,经调试发现,减少的两个对象地址还不同,但是内容完全一样(百度地图搜索地址返回了相同的地址,我们在外面包了一层,但是并没有重写isEqual函数),使用的删除对象函数是removeObject:obj。原来removeObject函数,系统会根据isEqual函数来判断是否是同一个对象,也就是说是系统自己判断出是相同的元素。为解决该问题,把所有的removeObject函数的调用改为removeObjectAtIndex函数。

1.hash函数只在元素放入NSMutableSet和NSSet,以及元素在NSDictionary中当作key时会被调用。
2.hash相同,并不代表是相同的元素,系统还会继续判断isEqual是否返回yes。
3.如果hash和isEqual都相同才会被认为是相同的元素,在set中如果三个相同的元素存入,最后只会存入一个元素。

:如果我们在重写的函数里直接返回[super hash]; 即使值不相同,也会走到isEqual,如果isEqual判断出时相同的,就会被认为是相同的元素。不知道是什么原因。感觉如果真要重写hash函数,还是自己写,不要调用[super hash].

正确的hash: return [self.name hash] ^ [self.birthday hash];

hash的一些经典使用:
1.找出两个文件中的重复元素:两个文件中的内容都转入放到hashTable中,每个元素我们遍历时做一下计数即可。>1的时重复元素,值最大的是出现次数最多的元素


参考:https://www.jianshu.com/p/d9e15b01a2b3

你可能感兴趣的:(hash和isEqual)