ReSharper GetHashCode 대체에 '397'이 사용되는 이유는 무엇입니까?


150

다른 많은 사람들과 마찬가지로 ReSharper를 사용하여 개발 프로세스 속도를 높입니다. 클래스를 사용하여 클래스의 동등성 멤버를 대체하는 경우 GetHashCode ()에 대해 생성 된 코드 생성기는 다음과 같습니다.

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (Key != null ? Key.GetHashCode() : 0);
            result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
            result = (result * 397) ^ ObjectId;
            return result;
        }
    }

물론 저 안에 몇 명의 회원이 있는데 왜 알고 싶은 것은 397입니까?

  • 편집 : 그래서 내 질문은 더 잘 표현 될 것입니다 .397 소수에 대해 '특별한'것이 소수입니까?

답변:


166

아마도 397은 결과 변수가 오버플로되어 해시 비트를 약간 혼합하여 해시 코드의 더 나은 분배를 제공하기에 충분한 크기의 소수이기 때문일 것입니다. 같은 크기의 다른 소수와 구별되는 397에 대해서는 특별히 특별한 것은 없습니다.


73
그리고 397은 행복합니다. 우리 모두가 행복하기를 원하지 않습니까?
Russell B

2
알았어.하지만 왜 소수 여야하고 왜 정확한 크기 여야합니까? 소수 여야하는 경우 2 또는 2147483647이 아닌 이유는 무엇입니까? 나는 좋은 돌연변이를 얻습니다 (그리고이 곱셈의 유일한 이유는 돌연변이입니다) 우리는 소수가 될 필요는 없습니다. 곱셈기는 상대적으로 동일한 수 또는 0과 1을 갖도록, 바람직하게는 명백한 패턴이 없어야합니다. 397 = 110001101b가 준수됩니다. 규모에 대해서는 아직 확실하지 않습니다.
Andriy K

5
Nick이 말했듯이 특별한 점은 없습니다. 그 크기가 필요하지는 않습니다. 해시를 계산할 때 결과가 오버플로 될 정도로 충분히 큰 숫자 일뿐입니다 (GetHashCode ()가 Int32를 반환하기 때문에). 소수를 선택하면 분포에 도움이됩니다. 수학 학위가 없으므로 시도하지 않고 설명하지는 않지만 소수를 곱하면 다른 임의의 숫자를 곱하는 것보다 더 잘 분포 된 결과가 나타납니다.
벤 랜달

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.