집 >백엔드 개발 >C#.Net 튜토리얼 >C# GetHashCode를 구현하는 방법
프로젝트에서 해시 테이블을 사용할 때 GetHashCode를 재정의해야 하는 경우가 있습니다. 일반적인 접근 방식은 다음과 같습니다.
버전 1:
도우미를 구현하고 T 유형을 전달하고 이 유형의 해시코드를 반환합니다. 함수 논리는 매우 간단합니다. 단지 null 검사를 수행합니다. obj가 비어 있지 않으면 obj의 해시 코드가 직접 사용됩니다.
public class HashHelper { private int _seed = 17; public int Hash<T>(T obj) { // why 31? // http://www.php.cn/ // shortly, to reduce the conflict of hashing key's distrabution return 31 * _seed + ((obj == null) ? -1 : obj.GetHashCode()); } }
왜 매직 넘버 31을 사용합니까? 소수 제품을 사용하면 상대적으로 고유성이 증가하고 해시 키 값 할당의 충돌이 줄어들 수 있으며 31은 컴파일러 최적화 고려 사항입니다. 효과적으로 ihttps://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/
구현 버전 2:
할 수 있습니다. 확장됨 이 클래스는 다양한 유형을 해시할 수 있는 유창한 인터페이스가 됩니다. 값 유형의 경우 오버로드의 의미는 컬렉션이나 제네릭에 대한 박싱을 줄이는 것입니다. 이는 외부 호출을 더 자연스럽고 더 읽기 쉽게 만드는 것입니다.
public class HashFluent { private int _seed = 17; private int _hashContext; public HashFluent Hash<T>(T obj) { // why 31? // http://www.php.cn/ // shortly, to reduce the conflict of hashing key's distrabution _hashContext = 31 * _seed + ((obj == null) ? -1 : obj.GetHashCode()); return this; } public HashFluent Hash(int? value) { _hashContext = 31 * _seed + ((value == null) ? -1 : value.GetHashCode()); return this; } public HashFluent Hash(IEnumerable sequence) { if (sequence == null) { _hashContext = 31 * _hashContext + -1; } else { foreach (var element in sequence) { _hashContext = 31 * _hashContext + ((element == null) ? -1 : element.GetHashCode()); } } return this; } public override int GetHashCode (){ return _hashContext; } // add more overridings here .. // add value types overridings to avoid boxing which is important }
위 내용은 C# GetHashCode 구현 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!