데이터베이스에서로드 된 일부 개체를 나타내는 클래스 집합이 있습니다. 이러한 객체에는 몇 가지 변형이 있으므로 공통 기본 클래스와 차이를 나타내는 두 개의 하위 클래스가 있습니다. 공통점이있는 주요 필드 중 하나는 id 필드입니다.이것은 안전한/유효한 해시 메소드 구현입니까?
개체의 ID는 모든 대안 콘텐츠에서 고유하지만 단일 유사 콘텐츠 내에서 고유하지 않습니다. 제 말은 타입 A의 단일 객체가 0에서 1,000,000 사이의 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)입니다. 나는 또한과 같이 ISEQUAL을 구현
-(NSUInteger)hash
{
return (NSUInteger)[self class]^[self.objectId hash];
}
: 그래서 BaseClass로에 다음과 같은 해시 함수함으로써 나는이 작업을 수행 할 수 있다는 생각이 작동하는 것 같군
- (BOOL)isEqual:(id)object
{
return (self == object) || ([object class] == [self class] && [self.objectId isEqual:[object objectId]]);
}
을,하지만 난 '생각 여기에서 클래스 포인터를 사용하여 해시를 생성하는 것과 같은 것을 특별히 간과하지 않도록 요청합니다. 이 방법이 안전한가요 아니면 더 좋은 방법이 있습니까?
궁금하신 분은 코코아에서 해시가 성능에 어떤 영향을 주는지에 대해 이야기하는 링크가 있습니다. http://www.mulle-kybernetik.com/artikel/Optimization/opti-7.html – codewarrior