문제

많은 분들과 마찬가지로 저 역시 개발 프로세스 속도를 높이기 위해 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에는 같은 크기의 다른 소수와 구별되는 특별한 특별한 점이 없습니다.

다른 팁

Ben이 맞습니다. 어셈블리를 반영하면 그것이 사용하기로 선택한 소수일 뿐이라는 것을 알 수 있습니다.

resharper가 사용하는 해시는 FNV 해시시.FNV는 종종 다른 소수로 구현됩니다.FNV에 대한 적절한 소수 선택에 대한 논의가 있습니다. 여기.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top