ValueType.GetHashCode의 기이함 탐구: 변하지 않을 수 있는 값
ValueType.GetHashCode의 기본 구현 방식을 둘러싼 음모 () 값 유형에 대한 해시 코드를 계산하는 것은 부인할 수 없습니다. 특정 예와 예상하지 못한 결과를 조사하여 이 수수께끼를 풀어보겠습니다.
다음 구조의 두 가지 사례를 고려해보세요.
struct TheKey { public int id; public string Name; }
이름 필드에 고유한 값을 할당하면 해당 해시 코드가 예상됩니다. 다르다. 그러나 출력 결과는 놀라운 사실을 드러냅니다.
var k1 = new TheKey(17, "abc"); var k2 = new TheKey(17, new string(new[] { 'a', 'b', 'c' })); Console.WriteLine("hash1={0}", k1.GetHashCode()); Console.WriteLine("hash2={0}", k2.GetHashCode()); // Output: // hash1=346948941 // hash2=346948941
다른 문자열 참조에도 불구하고 k1과 k2는 모두 동일한 해시 코드를 생성합니다.
Unveiling the Mechanics
ValueType.GetHashCode()의 기본 구현은 놀랍도록 복잡한 메커니즘을 통해 작동합니다. 주로 구조에 참조 유형 참조 또는 필드 갭이 포함되어 있는지 여부를 결정합니다. 두 조건이 모두 없으면 모든 값의 비트에 대해 효율적인 비트별 XOR 연산을 수행하여 모든 필드를 해시 코드로 효과적으로 결합합니다. 그러나 이 접근 방식은 보편적으로 적용 가능하지 않습니다.
참조 유형이나 공백이 있는 경우 코드는 필드별 순회를 시작하여 사용 가능한 필드(값 유형 또는 null이 아닌 객체)를 검색합니다. 참조. 일단 발견되면 이 필드의 해시 코드가 메서드 테이블 포인터와 XOR되어 최종 해시 코드가 형성됩니다.
The Mystery Unveiled
이 예에서는 사용 가능한 필드는 id입니다. 다양한 값에도 불구하고 문자열 필드는 무시되므로 k1과 k2 모두 동일한 ID를 가지며 결과적으로 동일한 해시 코드를 갖게 됩니다.
결론
이러한 색다른 동작을 이해하면 해시 코드 계산을 위한 값 유형을 신중하게 제작하는 것의 중요성이 강화됩니다. CLR의 기본 구현에만 의존하지 않는 것이 가장 중요합니다. 해시 코드 계산을 명시적으로 정의함으로써 개발자는 값 유형에 대한 해시 코드의 고유성과 일관성을 보장할 수 있습니다.
위 내용은 구조체 내의 다른 문자열 참조에 대해 동일한 ValueType.GetHashCode() 결과가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!