2010-11-22 1 views
0

두 개의 uint 값을 기반으로 Equals를 재정의 한 클래스가 있습니다. Equals를 재정의 했으므로 GetHashCode를 재정의해야합니다.GetHashCode()를 재정의하기 위해 두 uint를 int로 결합하는 가장 좋은 방법은 무엇입니까?

하나의 단위 값은 절대 중복이 없어야하는 ID를 나타냅니다. 반드시 자동 증가 int 값은 아니지만 대부분의 경우에 있어야합니다. 두 번째 uint 값은 객체의 유형 필드를 나타냅니다.

ID 필드 만 사용하면 충분합니다. 그러나 어떤 경우에는 약간 제한적일 수 있으므로 ID와 유형을 결합해야했습니다.

두 개의 숫자를 더한 다음 XOR을 사용하여 상위 비트와 하위 비트를 결합하는 방법을 생각했습니다.

다른 아이디어?

+0

는'UINT의 ID' 필드가 진정으로'uint'의 전체 범위를 점유 할 수 있습니까? – Ani

+0

우리는 그것을 허용해야합니다. – uriDium

+0

* 그러나 경우에 따라 조금 제한 될 수 있습니다 * - ID 필드 만 사용하면 너무 제한적인 경우에 대해 좀 더 설명 할 수 있습니까? –

답변

2

해시 코드는 Dictionary과 같은 해시 기반 컬렉션에 항목을 배포하는 데만 사용되므로 해시 코드는 가능한 적은 충돌을 생성하는 것이 이상적입니다.

그러나 최소 요구 사항은 주어진 값 집합에 대해 해시 코드가 항상 동일해야한다는 것입니다. 따라서 유효한 해쉬 코드 알고리즘이라 할지라도 :

public int GetHashCode() { 
    return 1; 
} 

비록 끔찍한 분포를 보여 주지만 여전히 기능적입니다. 당신이 해시 코드의 ID와 유형을 모두 사용하려면

, 당신은 단지 그들을 함께에 xor 수 있습니다

public int GetHashCode() { 
    return (int)Id^(int)Type; 
} 
1

id 복제본이 없을 (또는 드물게) 경우에만 사용할 수 있습니다.

그러나 일반적으로

두 가지의 int a위한 좋은 해시 코드를 얻을 수 및 b 당신은 작은 소수 p를 선택하고 a + p * b을 계산할 수 있습니다.

+0

일부 형식은 uint 범위의 맨 끝에있는 uint 값을 사용하므로 오버플로가 걱정됩니다. – uriDium

+2

@uriDium : 기본적으로 오버플로는 무시됩니다 (선택 취소). 오버플로가 발생해도 여기서 문제가되지 않습니다. 오버플로가 발생해도 해시 코드를 사용할 수 있습니다. –

관련 문제