多角度解读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.userId hash]。

也就是说如果比较对象的这2个属性是一致的,那么我们就认为这2个对象是相等的。

猜你喜欢

转载自www.cnblogs.com/code4appstyle/p/9073575.html