对于具有两个字符串和两个 BOOL 的对象,什么是好的哈希值?

What's a good hash for an object with two strings and two BOOLs?

提问人:Boon 提问时间:6/2/2014 最后编辑:Boon 更新时间:6/3/2014 访问量:223

问:

对于具有两个字符串和两个 BOOL 的类来说,什么是好的哈希值?

例如

@interface Person : NSObject

@property (nonatomic, copy) NSString *identifier;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) BOOL hasSpecialAbility;
@property (nonatomic, assign) BOOL hasEmotion;

- (BOOL)isEqualToPerson:(Person *)person;

@end

- (NSUInteger)hash {
  // Is this good or should I skip the BOOLs?
  return identifier.hash ^ name.hash ^ hasSpecialAbility ^ hasEmotion;
}

- (BOOL)isEqual:(id)object {
  ...
}

- (BOOL)isEqualToPerson:(Person *)person {
 ...
}
Objective-C 哈希码 相等

评论

1赞 gnasher729 6/2/2014
不聪明。四个 BOOL 组合只给出两个不同的哈希值。将所有实例变量更改为以下划线开头后,编写 ... ^ (_hasSpecialAbility << 0) ^ (_hasEmotion << 1)。
0赞 Hot Licks 6/2/2014
identifier.hash ^ name.hash ^ (hasSpecialAbility ? 1 : 0) ^ (hasEmoticon ? 2 : 0)
0赞 Boon 6/2/2014
@gnasher729 那 ... ^ (hasSpecialAbility |(有情感<<1))?
0赞 Hot Licks 6/2/2014
一般而言,您不能保证 BOOL 是任何特定值 -- 是任何非零值。YES

答:

0赞 Tommy 6/2/2014 #1

如果 、 等是不匹配的随机数,那么我通常会使用如下内容:r1r2

(bool1 ? r1 : r2) ^
(bool2 ? r3 : r4)

...因为采用更统一的方法可能会导致任何混合对象容器中不同类的实例之间发生哈希冲突,任何节省额外调用的东西都是值得的。isEqual:

评论

0赞 Hot Licks 6/2/2014
只有当 NSString 哈希值不合理统一时,您的论点才有意义。
0赞 Tommy 6/3/2014
@HotLicks我建议你重读一遍。它明确地谈到了“不同类的实例”。也许你从来没有写过一个不包含至少一个的类,但我敢打赌,几乎所有其他人都不是这样。NSString
0赞 Hot Licks 6/3/2014
我是说,只要 NSString 使用的哈希算法是相当统一的(并且哈希的使用者是合理编码的),那么它就没有区别。
0赞 Tommy 6/3/2014
@HotLicks那么你就会遭受理解力的失败。我创建和.每个属性都有两个属性。两人都不知道对方。 使用两者的实例作为单个字典的键。到底与降低碰撞概率有什么关系?那么,如果你必须倡导一个一般政策,那会是什么?再读一遍我的答案。ClassAClassBBOOLClassCNSString