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个对象是相等的。

转载于:https://www.cnblogs.com/code4appstyle/p/9073575.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值