2011-09-27 3 views
8

이 코드 블록에서 물결표의 목적은 무엇입니까?이 상황에서 물결표의 목적은 무엇입니까?

public override int GetHashCode() 
    { 
     return ~this.DimensionId.Id^this.ElementId.Id; 
    } 

^연산자 (C#을 참조) 진^운영자가 정수형 및 부울에 대해 미리 정의되어 2010 비주얼 스튜디오. 정수형의 경우 ^는 피연산자의 비트 배타적 OR을 계산합니다. bool 피연산자의 경우 ^는 피연산자의 논리 배타적 논리합을 계산합니다. 즉, 피연산자 중 하나가 참인 경우에만 결과가 참입니다.

은 ~ 연산자 (C# 1 참조) 비주얼 스튜디오 2,010 은 ~ 연산자는 각 비트를 반전시키는 효과를 갖는다는 피연산자의 비트 보수 동작을 수행한다. 비트 단위 보수 연산자는 int, uint, long 및 ulong에 대해 미리 정의됩니다.

~ (틸드) 연산자는 단일 정수 피연산자에 대해 비트 단위 보수를 수행합니다. 따라서 ~ 연산자는!와 단항 연산자 인 -, & 및 * 연산자와 같은 단항 연산자입니다. 숫자를 보완하는 것은 0 비트를 모두 1로 변경하고 모든 1을 0으로 변경하는 것을 의미합니다.

이유 이 문맥에서 사용되는 이유는 무엇입니까?

+0

값이 작 으면 xor 연산자가 잘못된 해시 분포를 생성하는 경향이 있습니다. 비트를 뒤집으면 바뀔 수 있습니다. 이것이 실제로 작동하는 확률은 좋지 않습니다. 하나를 소수에 곱하고 더하는 것이 더 효과적입니다. –

답변

13

해시 코드를 생성하는 한 가지 방법 일뿐입니다. 순서 독립적 인 무언가를 원한다면 XOR의 해시 코드에 대한 엄청난 팬이 아닙니다. 그러나 합리적으로 임의적이지만 반복 가능한 방식으로 비트를 뒤집는 합리적인 방법입니다.

기본적으로 여기에 두 개의 32 비트 값이 있습니다.이 값은 다른 형식으로 조합하여 다른 32 비트 값을 만들어야합니다.

return DimensionId.Id^ElementId.Id; 

를 ... 그러나 그것은 항상 아마 적합하지 않습니다 ElementId.Id == DimensionId.Id, 경우에 제로를 줄 것입니다 : 코드 는 어떤 비트 보수없이 함께 값을 약하게 한 수 있습니다. 다른 한편으로는, 주석 (doh!)에 표시된 것처럼 두 ID가 동일하면 항상 -1로 끝납니다. 반면에, {6, 4} 쌍은 다른 해시 코드를 {4, 6}으로 만드는 반면, 간단한 XOR은 그렇지 않습니다 ... 그것은 순서를 중요하게 만듭니다. 상대적으로 작은 풀에서 실제 식별자를 가져 오는 것이 중요 할 수도 있습니다.

XOR 자체가 의 변경이 어떤 비트 에 하나 ID 최종 해시 코드에 차이가 있는지 확인합니다.

개인적으로 나는 일반적으로 효과적인 자바에서 조쉬 블로흐의 패턴을 따릅니다.

unchecked 
{ 
    int hash = 17; 
    hash = hash * 31 + DimensionId.Id; 
    hash = hash * 31 + ElementId.Id; 
    return hash; 
} 

...하지만 그것은 단지 때문에 그런 식으로 1 해시의 속성의 일부이고, 그것은 어떤 의미에서 "잘못된"보여준 구현하지 않습니다.


1 일반적인 시나리오의 숫자에 고유 한 값을 생성에서 꽤 잘 작동하는 것 같다.분명히 해시 충돌을 막을 수는 없지만 의 ID가 실제로 1, 2, 3의 시퀀스에서 생성되면 ... 그러면 XOR과 같은 실제 충돌에서 더 잘 수행됩니다. 나는이 접근법을 분석하는 웹 페이지를 보았고 어느 번호가 잘 작동 하는지를 보았지만 어디서 기억할 수는 없다.

+0

Jon Skeet- 완전히 무시하는 질문 : 해시 코드에서 XOR에 대한 대안/더 나은 방법은 무엇입니까? XOR은 내가 잘 할 수있는 유일한 방법입니다. –

+0

@RitchMelton : 내가 댓글을 쓰는 동안 내가 선호하는 코드를 넣었을 것입니다 ... 내 대답의 맨 아래를보십시오. –

+0

@ 존 - 깊이 2 에드에서 C#에서이 연산자를 놓쳤습니까? 어떤 경우에도 정보에 감사드립니다! –

관련 문제