>백엔드 개발 >C#.Net 튜토리얼 >C# GetHashCode를 구현하는 방법

C# GetHashCode를 구현하는 방법

黄舟
黄舟원래의
2017-02-28 11:46:552130검색

프로젝트에서 해시 테이블을 사용할 때 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&#39;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&#39;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)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.