[hash] ReSharper GetHashCode 대체에 ‘397’이 사용되는 이유는 무엇입니까?

다른 많은 사람들과 마찬가지로 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 소수에 대해 ‘특별한’것이 소수입니까?


답변

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


답변

resharper가 사용하는 해시 는 FNV 해시 의 변형처럼 보입니다 . FNV는 종종 다른 소수로 구현됩니다. FNV의 적절한 소수 선택에 대한 토론이 여기에 있습니다 .


답변