ITEM 7 : GetHashCode의 함정을 이해하라.

|

ITEM 7. Understand the Pitfalls of GetHashCode().

               (GetHashCode의 함정을 이해하라.)



■ 요약 및 장점


1.      GetHashCode()를 재정의 하려면 아래의 3가지 룰을 따라야 한다.


     두 객체가 같다(Equal), 두 객체는 같은 해쉬 값을 리턴해야 한다.

     인스턴스의GetHashCode() 메소드는변경되서는안된다. (instance invariant)

     해쉬 함수는 모든 입력에 대한 모든 integer 사이에서 임의 분포(random distribution)을 생성해야만 한다.


2.      GetHashCode()함수는 해쉬기반 컬렉션에서 키(KEY)로써해쉬값을 정의 할때만 사용된다. , 컬렉션에 KEY값으로 사용할때만 GetHashCode() 함수를 사용한다 .따라서 그런 곳에서 사용할 때 정확하지 않을때만 재정의 해서 사용하여야 한다.


3.      당신이 생성하는 대부분의 타입에서, 가장 좋은 것은 GetHashCode()의 존재를 전적으로 회피하는 것이다.


4.      기본적인 System.Object System.ValueType에서의 GetHashCode()는 위의 3가지 룰을 따르면서 정확한 동시에 효율적이지 않는다이것들은 당신의 특수한 타입에 대한 지식 없이 가장 최적의 기본 행동(해쉬코드)을 제공한다.


5.      당신이 생성하는 타입에서 operator==()를 재정의 하면 반드시 GetHashCode()를 적절하게 재정의 해서 제공해야 첫번째의 룰에 맞게 된다. 왜나햐면 operator==()를 재정의 하지 않으면 Object.GetHashCode()는 항상 같은 해쉬값을 리턴하기 때문이다.


6.      Object.GetHashCode()는 비록 효율적인 분포를 필연적으로 생성하지는 않아도 참조 타임에 대해서는 정확히 동작한다. 좀더 나은 해쉬코드를 생성하려면 생성하려는 타입에 대해서 제약이 필요하다.


     Eqaulity에 사용한 프로퍼티들은 해쉬코드를 생성하는데에도 똑같이 사용 되어야 한다.

     두번째 규칙을 준수하려면, 해쉬코드를 생성하는 메서드는 변하지 않는 프로퍼티나 객체를 값으로 갖는 프로퍼티를 기반으로 해쉬코드를 생성하면 된다.

     세번째 룰을 지키는 것에 대한 마법의 함수는 없다. 임의분포를 구현하는데에 일반적인 성공적인 알고리즘은 변경이 가능한 필드(fields)는 제외하고 GetHashCode()에서 리턴하는 모든 변수들에 대헤서 XOR 연산을 하는 것이다.


7.      GetHashCode() 3가지의 룰을 모두 만족하는 것은 단지 불변의 타입(immutable type) 뿐이다. 다른 타입들은 기본 행동을 하지만, 함정에 유의해라.


■ Terms


1.      random distribution(임의 분포) : 어떤 한 순간에 발생한 사건의 확률이 다른 어떤 순간에 발생할 사건의 확률과

                                                    동일하게 분포된 것/ 대등한 기회


2.      Value Type : 선언과 동시에 스택에 메모리가 생성됨, int,float, struct도 속함


3.      Reference Type : 선언시 스택 메모리에 참조변수만 잡히고 힙영역에 메모리 할당됨, class가 속함


■ 해석이 모호하거나 중요한 구문


1.      해쉬테이블의 키로 사용되는 Object의 해쉬값이 왜 임의분포되어야 더 빠를까?


2.      It’s yet another reason why immutable value types are your best bet.

       ( 그것은 immutable value 타입이 왜 최상의 선택인지에 대한 또 다른 이유이다.)


■ 단어


1.      dedicated to:~에 전념하다, 헌신하다.

2.      so that : ~ 하기 위해서 cf)so ~ that : 너무 ~해서 ~하다.

3.      entirely : 전적으로,완전히,전부

4.      immutable : 불변의.변경할 수 없는.

5.      extensive :아주 넓은, 대규모의/ 광범위한. cf)extent 정도[규모]/크기

6.      along with : ~을 제외하고/~에 덧붙여/~와 마찬가지로

7.      violate : 위반하다/침해하다

8.      state : 말하다,진술하다/명시하다.

9.      even :(형용사로써) 평평한/고른/균등한/대등한/짝수(우수),고른

10.    distribution : 분배,배분/배포/유통

11.    subset : 부분 집합

12.    unconstraint :구속받지 않음,자유cf)constraint : 제약/통제

13.    misbehave :  못된 짓을 하다,비행을 저지르다

14.    in light of : ~을 고려햐여/~에 비추어

15.    with respect to~ : ~에 대하여.

16.    address : 고심하다/다루다.

17.    abide by : 준수하다, 지키다/따르다(법률)./감수하다.

18.    revisite : 다시 방문하다/다시 논으하다.

19.    cumbersome : 크고 무거운, 다루기 힘든/복잡하고 느린, 번거로운

20.    in which case = in that case : 그런 경우에

21.    yet : 아직 / 거기에 또

22.    necessarily : 어쩔 수 없이, 필연적으로


■ 피드백 및 개인 생각


   :이번 ITEM도 그렇지만 GetHashCode가 언제 사용되는지 모르는 나에게는 많이 생소했다.


    위의 요약에서도 나오듯이,  해쉬테이블에서 KEY 값으로 사용되는데에 정상적으로 작동하지 않을때만 재정의 하고, 

    이외에는 건들지 말자..

    

And