gpt4 book ai didi

objective-c - 这是安全/有效的哈希方法实现吗?

转载 作者:行者123 更新时间:2023-12-03 16:39:36 24 4
gpt4 key购买 nike

我有一组类来表示从数据库加载的一些对象。这些对象有几个变体,因此我有一个公共(public)基类和两个子类来表示差异。它们的共同关键字段之一是 id 字段。

不幸的是,对象的 id 并非在所有变体中都是唯一的,而是在单个变体中是唯一的。我的意思是,单个 A 类型对象的 id 可以在 0 到 1,000,000 之间。 B 类型的对象可以具有 25,000 到 1,025,000 之间的 id。这意味着 ID 号有一些重叠。不过,这些对象只是同一类事物的变体,所以我想在我的代码中将它们视为这样。 (由于遗留原因,他们被分配了来自不同集合的 ID。)

所以我有这样的类(class):

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

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

这些实例的唯一键本质上是(class + objectId)。所以我想我可以通过在 BaseClass 上创建以下哈希函数来做到这一点:

-(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]]);
}

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

最佳答案

这可能是安全的,但也不一定。如果您实际上以某种方式最终得到了一个子类(例如,如果 KVO 导致您的类切换为另一个*),那么依赖于严格的类标识可能会给您带来麻烦。如果使用某种显式类 ID,可能会更安全一些。

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

(*老实说,我根本不记得 secret KVO 子类是否伪装成父类,在这种情况下你在这里仍然是安全的,但我通常会尽量避免依赖于类身份。 )

关于objective-c - 这是安全/有效的哈希方法实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2539818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com