代码之家  ›  专栏  ›  技术社区  ›  Sean

这是一个安全/有效的哈希方法实现吗?

  •  2
  • Sean  · 技术社区  · 16 年前

    我有一组类来表示从数据库加载的一些对象。这些对象有几个变体,所以我有一个公共基类和两个子类来表示它们的区别。它们共同的关键字段之一是id字段。

    不幸的是,对象的id不是在所有变体中都是唯一的,而是在单个变体中。我的意思是,一个a类型的对象可以有一个介于,比如说,0到1000000之间的id。一个B类型的对象可以有一个介于,25000到1025000之间的id。这意味着id号有一些重叠。不过,这些对象只是同类事物的变体,所以我想在代码中这样看待它们(由于遗留的原因,他们被分配了来自不同集合的ID。)

    @class BaseClass
    @class TypeAClass : BaseClass
    @class TypeBClass : BaseClass
    

    基类有一个方法(NSNumber*)objectId。然而,TypeA和TypeB的实例可能有重叠的id,正如上面所讨论的,所以当涉及到相等性并将它们放入集合时,我不能仅仅使用id来检查它。

    -(NSUInteger)hash
    {
        return (NSUInteger)[self class] ^ [self.objectId hash];
    }
    

    我也这样实现了isEqual:

    - (BOOL)isEqual:(id)object
    {
        return (self == object) || ([object class] == [self class] && [self.objectId isEqual:[object objectId]]);
    }
    

    这似乎是可行的,但我想我在这里只是想确保我没有忽略某些东西-特别是通过以这种方式使用类指针生成哈希。这是安全的还是有更好的方法?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Chuck    16 年前

    还要记住,不相等的对象不需要有不同的散列。唯一的要求是相等的对象必须具有相同的哈希。因此,如果两个类中的对象具有相同的哈希值,只要这不会导致哈希表速度过慢,就可以了。