2010-03-29 3 views
2

데이터베이스에서로드 된 일부 개체를 나타내는 클래스 집합이 있습니다. 이러한 객체에는 몇 가지 변형이 있으므로 공통 기본 클래스와 차이를 나타내는 두 개의 하위 클래스가 있습니다. 공통점이있는 주요 필드 중 하나는 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]]); 
} 

을,하지만 난 '생각 여기에서 클래스 포인터를 사용하여 해시를 생성하는 것과 같은 것을 특별히 간과하지 않도록 요청합니다. 이 방법이 안전한가요 아니면 더 좋은 방법이 있습니까?

+0

궁금하신 분은 코코아에서 해시가 성능에 어떤 영향을 주는지에 대해 이야기하는 링크가 있습니다. http://www.mulle-kybernetik.com/artikel/Optimization/opti-7.html – codewarrior

답변

2

아마도 안전 할 수도 있지만 반드시 그런 것은 아닙니다. 엄격한 클래스 ID에 따라 어떻게 든 서브 클래스에 실제로 올라가면 (예 : KVO로 인해 클래스가 다른 클래스로 전환 될 경우) * 당신을 물릴 수 있습니다. 일종의 명시 적 클래스 ID를 사용하면 아마 조금 더 안전 할 것입니다.

불평등 한 객체는 다른 해시를 가질 필요가 없습니다. 유일한 요구 사항은 동일한 객체가 동일한 해시를 가져야한다는 것입니다. 따라서 두 클래스의 객체가 해시 테이블을 너무 많이 감추지 않는 한 동일한 해시를 갖는 것이 좋습니다.

(* 비밀 KVO 하위 클래스가 상위 클래스로 가장하는 경우 정직하게 생각하지 않습니다.이 경우에도 여전히 안전 할 수 있지만 일반적으로 클래스 ID에 따라 피하려고합니다.)

+0

아 - 그래서 해시는 isEqual이 YES 인 경우에만 동일한 것을 반환해야합니다. 그것은 내가 생각하고있는 것보다 이해하기 쉽고 쉽습니다. 그래서 나는 단지 objectId의 해시를 반환 할 수 있습니다. (id overlap이 있지만, 실제로는 공통점이 없습니다. 문제를 일으키지 않았 으면 좋겠다고 생각합니다.) KVO가이 모든 것에 어떻게 영향을 미치는지에 대한 답을 찾지 못했지만, 나는 변화 시켰습니다. isEqual : ==를 사용하여 클래스를 직접 비교하는 대신 isKindOf를 사용합니다. 감사! – Sean