Objective-C中的hash方法
1.Hash方法什么情况下会被调用
当对象被添加到集合NSSet中时,由于NSSet是无序的不能有重复对象的集合,所有要根据Hash值来快速查找集合中的对象,以判断集合中是否已存在该对象。
当对象被设置为NSDictionary中的key时,对象的hash方法会被调用用来生成唯一的标识符。同时为了提高查找的效率,会用将要设置为key的对象Hash来查找是否已存在相同的key。且此对象需要实现NSCopying协议,因为字典在将对象作为key的时候已经copy了一份,且字典需要保持这个key值不可变。否则作为key值的对象通过修改内部属性使其hash值发生变化,会使字典通过key找不到其值。如果对象没有实现NSCopying协议,在作为key时会报错!
2.通过hash值标识对象的唯一性
这个问题之前Mattt Thompson讨论过了,结论就是对关键属性的hash值进行位或运算作为hash值。例如:
- (NSUInteger)hash
{
//Masonry中计算hashCode的方法
return MAS_NSUINTROTATE([self.userId hash], MAS_NSUINT_BIT / 2) ^ [self.fromTime hash];
}
上面用来计算hash的方法是引用Masonry中的算法,也可以简单的写为[self.userId hash] ^ [self.fromTime hash]。
也就是说如果比较对象的这2个属性是一致的,那么我们就认为这2个对象是相等的。