1

이것은 이진 및 원시 전문가 용입니다. 나는 float R3 벡터 구조체를 구현하고 "평등"에 대한 내 정의는 실제로 "거의 동일"합니다. 구체적으로, 비교 벡터 Abs ((a [i] - b [i])/(a ​​[i] + b [i])의 모든 좌표에 대해 < .00001이 true를 반환합니다.GetHashCode() 오버로드가 semi-equal R3 float 벡터에 대해 동일하게 반환되도록하는 메서드

private static bool FloatEquality(float a, float b) 
    { 
     if (a == b) 
     { 
      return true; 
     } 
     else 
     { 
      float e; 
      try 
      { 
       e = (b - a)/(b + a); 
      } 
      catch (DivideByZeroException) 
      { 
       float g = float.Epsilon; 
       e = (b - a)/g; 
      } 
      //AppConsole.AppConsole.Instance.WriteLine(e); 
      if (e < .00001f && e > -.00001f) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 

내 문제로 인해 내가 "키"이러한 벡터를 사용할 수 있도록하려는 사실이 요구 사항을 충족 벡터에서 동일하게 나올 해시 값을 얻을 수있는 방법이 있는지 결정이다 사전.

위에서 알 수 있듯이 위 코드는 3 가지 좌표에서 평등을 확인하는 데 사용됩니다.

나는 세 개의 부동 소수점 좌표에서 바이트를 추출하고 각 중간에서 두 개를 사용하려고 생각했습니다.

(다음은 코드가 아니라 스택 오버플로 내가 그것을 들여 쓰기하지 않는 한 내가 그것을 게시하지 않습니다)

Vector(x,y,z): 
x's float byte[] = [ x1 x2 x3 x3 ] 
y's float byte[] = [ y1 y2 y3 y4 ] 
z's float byte[] = [ z1 z2 z3 z4 ] 

Hash code: byte[] {x2^x3 , y2^y3, z2^z3, x2^z3} 

또는 그런 일을 ... 한마디로 - 내가 확인하는 방법 궁금 내 equals 메서드에 맞는 벡터의 해시 코드는 항상 똑같을 것입니다 ... 누군가가 매우 낮은 비용 계산으로 좋은 아이디어를 가지고 있다면, 나는 그것을 듣고 싶습니다. 또는 만약 당신이 float가 어떻게 저장되는지 그리고 위의 비교 방법이 똑같이 리턴한다면 어떤 바이트가 항상 같을 까에 대해 더 자세히 설명하는 곳으로 나를 안내 할 수 있다면. 정말 바이트 중 하나가 내 생각과 일치시킬 것이라는 점을 확실 할 수있는 방법이 없기 때문에

내가 ...

답변

1

음을 새로운 비교 방법보다는 해시 함수를해야 할 수도 있습니다, 기본적인 아이디어는 간단합니다 - 당신은 인위적으로 당신의 수레의 정밀도를 줄여야합니다. 이 작업을 효율적으로 수행하는 방법은 예상되는 데이터 종류에 따라 크게 달라집니다. 당신은 대부분 작은 값을 사용하는 경우

예를 들어, 당신은 단순히 같은 것을 사용할 수 있습니다 : 나는 실제로 if (e < .00001f && e > -.00001f) 조건을 충족하고 있지 않다 동안, 그것은 중요하지 않습니다

(int)Math.Round(x1 * 1000) 
^ (int)Math.Round(x2 * 1000) 
^ (int)Math.Round(x3 * 1000) 

주 - 아이디어는 충돌을 줄이는 것과 같은 값이 동일한 해시 코드를 갖도록 보장하는 것입니다. 동일하지 않은 값이 동일한 해시 코드를 갖지 않도록하는 것이 반드시 필요하지는 않습니다. 나머지는 Equals, == 등의 덮어 쓰기로 처리해야합니다. 엄격한 평등 검사가 있어야합니다. Equals 및 회사와 달리 GetHashCode()에만에는 단일 벡터에 대한 데이터가 있으므로이 단일 벡터보다 많은 데이터를 사용하지 않아도됩니다.

해시 코드는 키 충돌이 자주 발생하지 않도록하기위한 것입니다. 그래서 Dictionary은 각각의 벡터가 0GetHashCode()에 반환 할 경우 계속 작동합니다. 단지 성능이 떨어질뿐입니다. 동등 벡터가 같은 해시 코드로 끝나는 한, 해시 코드는 사용자의 필요에 맞는 것이 될 수 있습니다.

물론 가장 좋은 방법은 벡터를 사전의 키로 사용하지 않는 것입니다. 관심있는 벡터의 부분을 찾아 (가장 도움이되는) 키로 사용하십시오.어쩌면 당신은 Dictionary을 실제로 찾을 수 없다는 것을 알게 될 것입니다 (예를 들어, 게임에서 벡터와 함께 사용할 수있는 다양한 공간 파티셔닝 방법이 있습니다. 간단한 격자 모양의 레이아웃에서부터 수동 공간 파티셔닝까지) BSP와 같은 것에).