2012-05-23 3 views
1

주어진 객체에 대한 내 자신의 사용자 정의 해시 코드를 구현할 것을 고려 중입니다 ... 내 사전에 key으로 사용하십시오. 2 개의 객체가 동일한 해시 코드를 가질 가능성이 있기 때문에, 어떤 추가 연산자를 재정의해야합니까? 그리고 재정의해야 할 것은 무엇입니까 (개념적으로)? 즉사용자 정의 GetHashcode 구현으로 인해 Dictionary 또는 Hashtable의 "버킷"에 문제가 발생할 수 있습니다

myDictionary.Add(myObj,myObj); 

myDictionary.Add(myObj.GetHashCode(),myObj); 

는 사전 고유성을 결정하기 위해 다음의 조합을 사용 않고있는 양동이에 객체를 배치?

다른 것보다 더 중요한 것은 무엇입니까?

  • 해시 코드
  • ()는

는 compareTo와 만 SortedDictionary 필요하다

  • ==
  • compareTo와 같음?

  • 답변

    1

    문제를 일으키는 버킷이 아닙니다. 해시 코드를 사용하여 버킷을 결정하면 실제로 올바른 개체 인스턴스를 찾습니다. 버킷의 모든 객체가 동일한 해시 코드를 공유하기 때문에 올바른 객체를 찾기 위해 객체 평등 (Equals)이 사용됩니다. 규칙은 두 객체가 동일하다고 간주되면 동일한 해시 코드를 생성해야하지만 동일한 해시 코드를 생성하는 두 객체는 ​​같지 않을 수 있습니다.

    2

    GetHashCode는 무엇에 사용됩니까?

    디자인 상으로는 해시 테이블에 개체를 넣는 것만 유용합니다. 그러므로 이름.

    GetHashCode는 해시 테이블 균형을 조정하기 위해 설계되었습니다. 다른 용도로 사용하지 마십시오. 특히 :

    • 개체에 고유 한 키를 제공하지 않습니다. 충돌 확률이 매우 높습니다.
    • 암호 강도가 없으므로 디지털 서명의 일부로 사용하거나 암호와 동등한 암호로 사용하지 마십시오.
    • 체크섬에 필요한 오류 감지 속성이 반드시있는 것은 아닙니다.

    등등.

    에릭 Lippert의

    http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/