Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 这是一个安全/有效的哈希方法实现吗?_Objective C_Cocoa - Fatal编程技术网

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

Objective c 这是一个安全/有效的哈希方法实现吗?,objective-c,cocoa,Objective C,Cocoa,我有一组类来表示从数据库加载的一些对象。这些对象有几个变体,因此我有一个公共基类和两个子类来表示差异。它们共同的关键字段之一是id字段 不幸的是,对象的id不是在所有变体中唯一的,而是在单个变体中唯一的。我的意思是,一个类型为a的对象可以有一个介于0和1000000之间的id。类型B的对象的id可以在25000到1025000之间。这意味着身份证号码有些重叠。不过,这些对象只是同类事物的变体,所以我想在我的代码中考虑它们。(由于遗留原因,他们从不同的集合中分配了ID。) 所以我有这样的课程: @

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

不幸的是,对象的id不是在所有变体中唯一的,而是在单个变体中唯一的。我的意思是,一个类型为a的对象可以有一个介于0和1000000之间的id。类型B的对象的id可以在25000到1025000之间。这意味着身份证号码有些重叠。不过,这些对象只是同类事物的变体,所以我想在我的代码中考虑它们。(由于遗留原因,他们从不同的集合中分配了ID。)

所以我有这样的课程:

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

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

-(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,可能会安全一点

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


(*老实说,我不记得如果秘密KVO子类伪装成父类,在这种情况下,您在这里仍然是安全的,但我通常会尽量避免依赖于类标识。)

Ah-因此,如果isEqual为YES,哈希只需要返回相同的内容。这是有道理的,而且比我想象的要容易。所以我可以单独返回objectId的散列。(有id重叠,但在实践中并不常见——只是我想确保不会引起问题。)我还没有找到关于KVO如何影响所有这些的确切答案,但我确实改变了isEqual:使用isKindOf:而不是直接将类与==进行比较。谢谢如果你好奇的话,这里有一个链接,讨论了如何在Cocoa中使用哈希,并对性能产生了影响。