我有一組類來表示從數據庫加載的一些對象。這些對象有幾個變體,所以我有一個共同的基類和兩個子類來表示差異。他們共同的關鍵領域之一是一個id字段。這是一個安全/有效的哈希方法實現?
不幸的是,對象的id在所有變體中並不是唯一的,而是在單個變體中。我的意思是,類型A的單個對象可以具有介於0和1000000之間的id。類型B的對象可以具有介於25,000和1,025,000之間的ID。這意味着ID號碼有一些重疊。儘管如此,對象只是同一類事物的變體,所以我想在我的代碼中將它們想象成這樣。 (他們來自不同的組分配的ID遺留原因。)
所以我上課是這樣的:
@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]]);
}
這似乎是工作,但我想我我只是在這裏問,以確保我沒有忽視某些東西 - 特別是通過使用類指針來生成散列。這是安全還是有更好的方法來做到這一點?
如果你很好奇,這裏有一個鏈接,講述瞭如何在Cocoa中使用散列,並對性能進行傾斜。 http://www.mulle-kybernetik.com/artikel/Optimization/opti-7.html – codewarrior 2010-03-30 00:00:27