【问题标题】:How to implement -hash for -isEqual: with OR condition?如何为 -isEqual 实现 -hash: 与 OR 条件?
【发布时间】:2012-12-29 17:45:05
【问题描述】:

假设我有这个-isEqual: 方法:

- (BOOL)isEqual:(MyObject*)aObject {
    if (![aObject isKindOfClass:[MyObject class]]) {
        return NO;
    }

    return ([self.dateString isEqualToString:aObject.dateString] || [self.date isEqual:aObject.date]) &&
     ((!self.title && !aObject.title) || [self.title isEqualToString:aObject.title]);
}

因此,如果datedateString 相等且title 相等,则认为两个对象相等。我们在这里假设datedateString 不能为零,否则我们也必须检查它。我们进一步假设,datedateString 之间没有已知的关系。

如何实现对应的-hash 方法,以满足两个相等对象必须具有相同哈希的要求?

我尝试通过遵循 great algorithm 来实现它,但我很难将两个日期的 OR 条件转换为适当的哈希方法。

(诚然,这个问题有点学术性,因为人们可能会质疑这种平等是否有意义。由于我有兴趣找到一个通用的解决方案,请不要发布答案,我应该更改我的 isEqual: . 除非可以正式证明不存在合适的-hash 方法。)

【问题讨论】:

    标签: objective-c cocoa equality


    【解决方案1】:

    您将完全忽略日期和日期字符串,仅根据标题创建哈希值。

    - (NSUInteger)hash
    {
        return self.title.hash
    }
    

    这将确保相等的对象始终具有相同的哈希值。具有相同哈希的对象不需要相等。

    【讨论】:

    • 谢谢,有时解决方案如此简单,您甚至想都没想!
    • 尽管如此,纯粹出于学术兴趣:如果我们只有 OR 子句而没有标题相等性检查,那么合适的哈希方法是什么?只返回一个常量?
    • 如何计算一个哈希值,该哈希值仅涉及与未知对象中的另一个字段相等的字段?你不能。哈希应该涉及所有字段,对于每个输入都是唯一的,并且理想地输出随机分布。您的 OR 相等定义与此不兼容。对于 Bernstein 以外的一些哈希算法,请参阅eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2023-03-14
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多