如何正确覆盖HashCode方法?

时间:2016-01-20 06:24:57

标签: ios objective-c

  

我定义了类用户,用户有两个成员变量 - > NSString* name , NSSString* pass   我希望通过NSSet Conllection存储它们,所以我重写 - (NSUInteger)哈希方法,如下所示

-(NSUIntegar) hash
{
      NSLog(@"Hash Method  %@",[self class]);
      NSUInteger nameHash = name == nil ? 0 : [name hash];
      NSUInteger passHash = pass == nil ? 0 : [pass hash];
      return nameHash * 31 + passHash;
}
  

main.m 文件

NSSet* set = [NSSet setWithObjects:
                  [[User alloc] initWithName:@"nike" pass:@"123"],
                  [[User alloc] initWithName:@"nool" pass:@"456"],
                  [[User alloc] initWithName:@"boow" pass:@"124"],
                  [[User alloc] initWithName:@"enla" pass:@"124"],
                  [[User alloc] initWithName:@"boow" pass:@"124"],//same as member 3
                  nil];
    NSLog(@"set count = %ld",[set count]);
    NSLog(@"%@",NSCollectionToString(set));
  

NSCollectionToString(id collection)

NSString* NSCollectionToString(id collection)
{

NSMutableString* result = [NSMutableString stringWithFormat:
                            @"["];
for (id object in collection) {
    [result appendString:[object description]];
    [result appendString:@","];
}
NSUInteger len = [result length];

[result deleteCharactersInRange:NSMakeRange(len - 1, 1)];
[result appendString:@"]"];
return result;
}
  

但是控制台输出:set count = 5   为什么不是4?错在哪里?

1 个答案:

答案 0 :(得分:1)

您需要覆盖两者哈希函数和isEqual:方法。

散列函数必须根据isEqual为任何两个相等的对象返回相同的散列值。 应该根据isEqual为不相等的对象返回不同的值,但除了性能之外,这不是必需的。默认的isEqual函数只是比较对象指针,因此具有相同数据的两个对象比较不相等。这就是为什么你的两个具有相同数据的对象都被添加到集合中的原因。