hashCode()
Boolean 클래스 의 메서드는 다음과 같이 구현됩니다.
public int hashCode() {
return value ? 1231 : 1237;
}
1231과 1237을 사용하는 이유는 무엇입니까? 왜 다른 건 없나요?
답변
1231과 1237은 단지 두 개의 (충분히 큰) 임의의 소수입니다 . 다른 두 개의 큰 소수는 괜찮습니다.
왜 소수인가?
1000과 2000과 같은 복합 숫자 (프라임이 아님)를 1 초 동안 선택했다고 가정합니다. 부울을 해시 테이블에 삽입 할 때 true 와 false 는 버킷 1000 % N
resp 2000 % N
(여기서는 N
버킷 수)로 이동합니다.
이제
1000 % 8
같은 버킷2000 % 8
1000 % 10
같은 버킷2000 % 10
1000 % 20
같은 버킷2000 % 20
- ….
즉, 많은 충돌이 발생할 수 있습니다.
이는 1000의 인수 분해 (2 3 , 5 3 )와 2000의 인수 분해 (2 4 , 5 3 )에는 너무 많은 공약수가 있기 때문입니다. 따라서 소수는 버킷 크기와 공통 요소가 없을 가능성이 높기 때문에 선택됩니다.
왜 큰 소수. 2와 3은하지 않을까요?
복합 객체에 대한 해시 코드를 계산할 때 구성 요소에 대한 해시 코드를 추가하는 것이 일반적입니다. 많은 수의 버킷이있는 해시 세트에서 너무 작은 값을 사용하면 객체가 고르지 않게 분산 될 위험이 있습니다.
충돌이 중요합니까? 부울은 어쨌든 두 개의 다른 값을 가지고 있습니까?
맵은 다른 객체와 함께 부울을 포함 할 수 있습니다. 또한 Drunix가 지적했듯이 복합 객체의 해시 함수를 만드는 일반적인 방법은 하위 구성 요소 해시 코드 구현을 재사용하는 것입니다.이 경우 큰 소수를 반환하는 것이 좋습니다.
관련 질문 :
답변
위에서 말한 모든 것 외에도 개발자의 작은 이스터 에그 일 수도 있습니다.
참 : 1231 => 1 + 2 + 3 + 1 = 7
7-유럽 전통에서 행운의 숫자입니다.
거짓 : 1237 => 1 + 2 + 3 + 7 = 13
13 (일명 Devil ‘s dozen)-불운 한 숫자.