Development/C#
[제프리 리처의 CLR via C#] 객체 해시 코드
오늘도 진이
2021. 5. 12. 11:05
목차
2부. 타입 설계
5장. 기본, 참조, 값 타입
객체 해시 코드
- 만약 Equals 메서드를 재정의했다면, 반드시 GetHashCode 메서드에 대해서도 재정의를 해주어야만 한다.
- System.Collections.HashTable 타입, System.Collections.Generic.Dictionary 타입을 비롯한 다른 모든 컬렌션들에거는 두 개의 객체가 동일한 객체인지 살펴보기 위한 목적으로 같은 해시 코드를 계산할 수 있는지를 살펴보기 때문이다.
- 기본적으로 컬렉션에 키/값 쌍을 추가할 때, 객체로부터 얻어진 해시 코드가 키 객체로 사용된다.
- 여러분이 만드는 타입의 인스턴스를 식별하기 위한 해시 값 계산 알고리즘을 선택할 때에는 다음의 가이드라인을 고려하여 적절한 방식을 찾는 것이 좋다.
- 해시 테이블이 최상의 성능을 보여줄 수 있도록 충분히 임의 분포적(Random Distributed)인 알고리즘을 사용하는 것이 좋다.
- 여러분이 만드는 알고리즘에서 상위 타입의 GetHashCode 메서드에 대한 반환 값을 이용할 수도 있다. 하지만 Object 타입의 GetHashCode 메서드와 그 결과 값을 이용하지는 않는 것이 좋다. 왜냐하면 기본 GetHasgCode 메서드가 제공하는 결과는 충분히 성능이 뛰어나지 않기 때문이다.
- 알고리즘에서 최소한 하나 이상의 인스턴스 필드를 활용해야만 한다.
- 이상적으로, 여러분의 알고리즘에서 활용하는 모든 필드들은 변경 불가 상태여야 하는데, 모든 필드들이 생성 시점 당시의 상태를 유지해야 하고 객체의 생명주기 동안 단 한 번도 값이 변경되어서는 안 된다.
- 알고리즘이 실행되는 속도가 빠르면 빠를수록 좋다.
- 같은 값을 가지는 객체에 대해서는 항상 같은 해시 코드 값을 반환해야 한다. 예를 들어 같은 텍스트를 포함하는 두 개의 문자열은 항상 같은 해시 코드 값을 반환해야 한다.
중요
만약 필요에 의해서 여러분이 직접 고유의 해시 테이블 컬렉션을 만들거나 GetHashCode 메서드에 대응하는 임의의 코드를 만들게 된다면, 해시 코드 값을 무슨 일이 있어도 재사용해서는 안 된다. 해시 코드 값 자체는 언제든 변할 수 있기 때문이다. 예를 들어 어떤 타입의 차기 버전에서는 이전과는 다른 알고리즘을 사용해서 해시 코드 값을 계산하도록 예고 없이 변경될 수 있기 때문이다.
Uploaded by Notion2Tistory v1.1.0