2016-06-09 8 views
3

IEqualityComparer<T>에서 파생 된 클래스를 작성했습니다.이 클래스는 필자가 필요로하는 LINQ 쿼리에 유용합니다.직접 비교를 위해 IEqualityComparer <T>의 GetHashCode() 부분을 사용합니까?

내가 알고 있듯이, GetHashCode() (빠름)이 먼저 호출 된 다음 해시 코드가 동일하면 Equals() (약간 더 느림)이 먼저 호출됩니다.

그러나 수동으로, 나는 빠른 GetHashCode() 평등 검사를 거치지

return new MyIEqualityComparer().Equals(objA,objB); 

같은 것을 사용하고, 직접적인 비교를 위해 그것을 사용하는 경우. objAobjB과 비교하여 더 빠른 GetHashCode() 검사를 자동으로 건너 뛰지 않는 방법이 있습니까?

나는 objA.Equals()IEqualityComparer<T>에서 파생 된 인수를 허용하는 오버로드를 가지기를 바랐다 고 생각합니다.

+1

해결하려는 성능 문제가 있습니까, 아니면 그냥 '최적화'입니까? – stuartd

+0

GetHashCode는 평등성을 증명하지 않으므로 항목이 해시 테이블 (사전 또는 HashSet)에 속한 버킷을 찾을 수 있으므로 전체 컬렉션 대신 훨씬 적은 수의 항목에 대해 실제 평등 확인을 수행 할 수 있습니다. –

+0

주된 목적은 객체를 해시 테이블에 넣는 것입니다. 사용자가 그것이 더 빠르 든 빠르든지에 대해 어떠한 보증도 할 수 없다고 생각합니다. –

답변

0

그것의 정말 분명 당신은 여기까지입니다,하지만 당신은 항상 IEquatable<T>를 구현하고, 따라서 GetHashCode() 빠른 사용 MyIEqualityComparer에 위임 할 수있는 : 해시 코드를 계산 일반적으로 느린 해시를 비교

class My : IEquatable<My> 
{ 
    public bool Equals(My other) 
    { 
     return new MyIEqualityComparer().Equals(this, other); 
    } 
} 
2

평등을 직접 비교하는 것보다 추가 작업입니다.

해시 코드는 O(1) 해시 테이블 동작을 지원합니다. 해시 테이블이 작동하는 데 필요한 숫자로 오브젝트를 맵핑합니다. 해시 코드는 단순히 동등한 비교에 도움이되지 않습니다.

그냥 Equals을 사용하십시오. 당신은 내가 도우미 메서드 사용하십시오 (좋은 생각은 아니지만) 최고의 아이디어를 구현하는 방법을 알고 싶다면

: (. 교육의 목적으로 만 사용됨)

static bool ExperimentalEquals<T>(T a, T b, IEqualityComparer<T> c) { 
if (c.GetHashCode(a) != c.GetHashCode(b)) return false; 
return c.Equals(a, b); 
} 

캐시 된 해시 코드의 경우 실제로 더 빠를 수 있다고 생각할 수 있습니다. 그러나 Equals은 캐시 된 해시 코드 자체를 사용하여 비교를 단락시킬 수 있습니다.