2010-08-23 3 views
2

개체의 ID를 기반으로 해시 코드를 생성하려면 어떻게해야합니까?.net의 개체 ID를 기반으로 해시 코드 생성

  • object.ReferenceEquals(a, b) == true 경우, 다음 ab가 같은 해시 코드를 얻을 것이다 :

    는 내 말은 것입니다.

  • object.ReferenceEquals(a, b) == false 인 경우 ab은 동일한 해시 코드라도 다른 해시 코드를 얻을 수있는 적절한 기회가 있어야합니다.

는 내가 가지고있는 것은 :

class SomeClassThatMakesSenseToCompareByReferenceAndByValue { 
    override Equals(object o) { 
     return MemberwiseEquals(o); 
    } 

    override GetHashCode() { 
     return MemberwiseGetHashCode(); 
    } 
} 

class SomeClassThatNeedsReferenceComparison { 
    SomeClassThatMakesSenseToCompareByReferenceAndByValue obj; 

    override Equals(object o) { 
     return o is SomeClassThatNeedsReferenceComparison && object.ReferenceEquals(this.obj, (o as SomeClassThatNeedsReferenceComparison).obj); 
    } 

    override GetHashCode() { 
     return ????? 
    } 
} 
+2

이 문제에 대한 사용 사례가 좀 더 자세히 설명되어 있습니다. –

+0

* "[...] 멤버쉽이 같더라도 다른 해시 코드를 얻을 수 있습니다"* - 조금 이상하게 들립니다. 'GetHashCode' 문서 ("Notes to implementers"에서)에서 다음 텍스트를보십시오 : * "두 객체가 같다고 비교하면 각 객체의 GetHashCode 메소드는 같은 값을 반환해야합니다"*. 나는 무언가를 놓칠지도 모른다. –

+0

그래서 내 'SomeClassThatMakesSenseToCompareByReferenceAndByValue' 클래스가 일관된 해시 코드를 반환합니다. 그러나 다른 클래스에서는 정체성에 따라'GetHashCode'와'Equals'을 사용하고 싶습니다. – erikkallen

답변

3
+1

그것은 객체에 대한 완전한 동등한 것입니다. GetHashCode – Andrey

+0

고맙습니다. – erikkallen

+0

@Andrey 오브젝트의 동적 유형이 GetHashCode를 대체하지 않는 경우에만 동등합니다. @erikkallen 당신은 오신 것을 환영합니다. –

2

당신이 그 같은 글의 해시 코드를 반환합니다 GetHashCode를 오버라이드 (override)하지 않는 경우.

+0

예,하지만 다른 방법으로 해당 기능에 액세스해야합니다. – erikkallen

+0

@erikkallen 다른 방법으로는 무엇입니까? –

+1

주어진'object.ReferenceEquals (a, b) == true''GetHashCode'의 구현은'a'와'b'에 대해 다른 결과를 낳지는 않을 것이라고 말하고 싶습니다. (기본적으로 무작위 요소 또는 시간). –

1

두 가지 개체가 동일한 인스턴스를 가리 키므로 기본 구현을 사용하는 두 개체에 대해 항상 동일한 HashCode가 생성됩니다.