나는 조슈아 블로흐의 의 Chapter 3을 통해 읽었습니다. 항목 8 : 37 선정 이유를 그는 다음 설명정수 곱하기, 오버플로 및 정보 손실시
result = 37 * result + c;
(강조 추가) :
재정의 할 때는 항상에 해당 해시 코드를 오버라이드 (override), 저자는 자신의 해시 함수에서 다음과 같은 결합 단계를 사용합니다곱셈기 37이 홀수 소수이기 때문에 선택되었습니다. 이 짝수이고 곱셈이 오버플로 된 경우 정보가 손실됩니다. 은 2로 시프트하는 것과 동일합니다. 소수를 사용하면 얻을 수있는 이점은 덜 있지만 이지만이 목적으로 소수를 사용하는 것이 일반적입니다.
내 질문에 왜 조합 계수 (37)가 홀수일까요? 곱셈 오버 플로우가 요인이 홀수인지 짝수인지에 관계없이 정보가 손실되지 않을까요?
아, 우리가 걱정하는 오버 플로우에서 얻을 수있는 정보 손실이 조금도 아닙니다. 결과를 제로로 만들면 얻을 수있는 정보가 완전히 손실됩니다. –
@BilltheLizard : 사실, 서로 에뮬레이션하는 여러 속성의 데이터입니다. 위의 알고리즘'result = 2 * (2 * a + b) + c'를 사용하여 세 개의 프로퍼티 a, b, c를 가정하면, 아마도'a, b, c'의 많은 공통 집합에 중복이 있음을 알 수 있습니다. 홀수 프라임을 상수로 사용하면 같은 해시 값을 가진 집합을 가질 가능성이 훨씬 줄어 듭니다. –
결과를 완전히 초기화하기 전에 문제가 발생합니다. 8 비트 해시에 2의 승수를 한 번만 곱하면 256 개의 가능한 값으로 시작하고 128 개의 가능한 값으로 끝납니다. –