2008-09-19 5 views
124

많은 분들처럼 개발 프로세스의 속도를 높이기 위해 ReSharper를 사용합니다. 내가 거기에 내 자신의 회원 중 일부가 물론ReSharper GetHashCode 재정의에 '397'이 사용되는 이유는 무엇입니까?

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; 
     } 
    } 

, 그러나 나는 무엇을 걸려 : 당신이 클래스의 평등 멤버를 오버라이드 (override)를 사용하는 경우, 것처럼 GetHashCode (위해 생성하는 코드 세대)가 보인다 알기 위해 왜 397입니까?

  • 편집 : 그래서 내 질문은 더 좋을 것입니다. 소수 이외의 397 소수에 대해 '특별한'것이 있습니까?

답변

134

아마도 397은 결과 변수가 오버플로되어 해시 비트를 다소 섞어서 해시 코드를 더 잘 분배하기에 충분한 크기의 소수 일 것입니다. 같은 크기의 다른 소수와 구별되는 특별한 것은 없습니다.

+59

그리고 397이 행복합니다. 우리 모두 행복하게되고 싶지 않아? –

+2

좋아요,하지만 왜 그것이 소수인지, 왜 그 정확한 크기가되어야합니까? 소수가되어야한다면 2 또는 2147483647을 사용해야합니다. 나는이 돌연변이가 좋은 돌연변이를 가질 것이라고 추측한다. 우리는 multiplicator가 상대적으로 동일한 수 또는 0과 1을 가질 필요가 있습니다. 397 = 110001101b가 준수합니다. 크기가 확실하지 않습니다. –

+4

닉이 말했듯이, 특별히 특별한 것은 없습니다. 그것은 그 크기 일 필요는 없습니다. 그것은 해시를 계산할 때 결과가 오버 플로우됩니다 (GetHashCode()가 Int32를 반환하기 때문에)만큼 큰 숫자 일뿐입니다. 프라임을 선택하는 것은 배포에 도움이 될 뿐이며, 수학 학위가 없으므로 설명하지는 않겠지 만 프라임 곱셈은 다른 임의의 수에 의한 곱셈보다 더 잘 분산 된 결과를 갖습니다. –

15

벤은 정확합니다. 조립품을 반영하여 사용하기로 선택한 소수임을 알 수 있습니다.

+8

어떤 어셈블리입니까? –

+9

asm :'JetBrains.ReSharper.Feature.Services.CSharp' 방법 :'CSharpEqualityHelper.GenerateGetHashCodeBody' –

6

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

관련 문제