【问题标题】:What's a good hash for an object with two strings and two BOOLs?对于具有两个字符串和两个 BOOL 的对象,什么是好的散列?
【发布时间】:2014-07-22 15:41:27
【问题描述】:

对于具有两个字符串和两个 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 {
 ...
}

【问题讨论】:

  • 不聪明。四个 BOOL 组合只给出两个不同的哈希值。将所有实例变量更改为以下划线开头后,写入 ... ^ (_hasSpecialAbility
  • identifier.hash ^ name.hash ^ (hasSpecialAbility ? 1 : 0) ^ (hasEmoticon ? 2 : 0)
  • @gnasher729 怎么样... ^ (hasSpecialAbility | (hasEmotion
  • 一般来说,您不能保证 BOOL 是任何特定值——YES 是任何非零值。

标签: objective-c hashcode equality


【解决方案1】:

如果r1r2 等是不匹配的随机数,那么我通常会使用类似的东西:

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

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

【讨论】:

  • 你的论点只有在 NSString 哈希值不合理的情况下才有意义。
  • @HotLicks 我建议你重新阅读它。它明确谈论“不同类的实例”。也许你从来没有写过一个不包含至少一个 NSString 的类,但我敢打赌,几乎所有其他人都不是这样。
  • 我的意思是,只要 NSString 使用的哈希算法是合理统一的(并且哈希的消费者被合理编码),那么它就没有区别。
  • @HotLicks 那么你正在遭受理解失败。我创建ClassAClassB。每个都有两个BOOL 属性。彼此都不知道。 ClassC 使用两者的实例,例如单个字典的键。 NSString 到底与降低碰撞概率有什么关系?因此,如果您必须倡导一项总体政策,那会是什么?再读一遍我的答案。
猜你喜欢
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多