2013-04-13 1 views
1

나는 현재 코코아 컬렉션을 연구 중이고 나의 연구는 객체 평등과 해싱에 대한 Mike Ash의 post을 가져왔다. 당신이 ISEQUAL를 오버라이드 (override)하는 경우 때문에 해시의 의미의코코아. Object equality and hashing clarification

: 다음 해시를 오버라이드 (override) 할 필요가

은 다음 포스트에서 exerpt입니다. 그렇지 않으면 두 개의 객체가 같지만 동일한 해시를 가지지 않을 수 있습니다. 이러한 객체를 사전, 설정 또는 해시 테이블을 사용하는 다른 객체에서 사용하면 그럴 수 있습니다.

불행히도 필자는 우스꽝스런 일이 일어날 지에 대한 자세한 내용을 알지 못하며, 호기심으로 인해 내가 더 깊이 파고 들지 않고 떠날 수는 없다. 그래서 질문입니다 : 정확히 내가 다른 해시 값을 가진 두 개의 동일한 개체가 있고 내가 하나의 컬렉션에 이러한 개체를 넣으면 어떻게 될 것인가? 어떤 종류의 문제가 생길까요?

답변

5

대답은 마이크의 포스트

해시 테이블은 기본적으로 특별한 인덱싱 큰 배열에서이 섹션에 있습니다. 객체는 해시에 해당하는 색인이있는 배열에 배치됩니다. 해시는 기본적으로 객체의 속성에서 생성 된 의사 난수입니다. 아이디어는 인덱스를 무작위로 만들어 두 객체가 동일한 해시를 가질 가능성을 없애고 완전히 재현 할 수 있도록하는 것입니다. 오브젝트가 삽입되면, 해쉬는 어디로 가는지를 결정하는 데 사용됩니다. 객체를 검색 할 때 해시를 사용하여 검색 할 위치를 결정합니다.

보다 공식적인 용어로, 객체의 해시는 두 객체가 동일한 경우 동일한 해시를 갖도록 정의됩니다. 반대의 경우는 사실이 아니므로 두 객체가 동일한 해시를 가질 수 있으며 같지 않을 수 있습니다. 두 개의 불균등 한 객체가 동일한 해시 (충돌이라고 함)를 가질 때 해시 테이블은이 작업을 처리하기 위해 특별한 조치를 취해야하므로 속도가 느려질 수 있으므로 가능한 한 많이 피하려고합니다. 그러나 완전히 피할 수는 없습니다.

의미하는 바는 당신이 평등하다고 주장하는 두 가지 물건을 갖게된다는 것입니다. 처음 값을 사전에 키로 추가합니다. 그런 다음 다른 객체를 키로 사용하여 해당 값을 추출합니다. 그리고 그것은 작동하지 않습니다. 그것은 당신의 사물이 동등하기 때문에해야합니다. 그러나 초기 해시 검색에 실패했습니다.

이것은 분명히 알 수 있습니다. 일부 개체에서는 제대로 작동하고 다른 개체에서는 실패 할 수 있습니다. 요점은 두 가지 방법을 모두 구현하지 않으면 일어날 일을 알 수 없다는 것입니다.

0

"이유"를 알고 싶다면 Apple 설명서를 살펴 봐야합니다.

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html%23//apple_ref/occ/intfm/NSObject/isKindOfClass

:

If two objects are equal, they must have the same hash value. 

다른 모든 논의는 학문적 관점에서 재미있다,하지만 당신은 재단 프레임 워크를 사용하려면 기본적으로 당신이 사과 규칙에 동의 여부, 당신이 그들을 준수해야합니다.

NSDictionary의 현재 화신에 대한 Mike와 위의 포스터에서 말하는 내용은 향후 릴리스에서 동일한 구현이 그대로 유지 될 것이라는 보장은 없습니다. 그러나 애플이 무엇을 대신 할지라도, (아마도) 모든 보증과 제한을 유지할 것입니다.