Boolean.hashCode ()


답변:


140

1231과 1237은 단지 두 개의 (충분히 큰) 임의의 소수입니다 . 다른 두 개의 큰 소수는 괜찮습니다.

왜 소수인가?
1000과 2000과 같은 복합 숫자 (프라임이 아님)를 1 초 동안 선택했다고 가정합니다. 부울을 해시 테이블에 삽입 할 때 truefalse 는 버킷 1000 % Nresp 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가 지적했듯이 복합 객체의 해시 함수를 만드는 일반적인 방법은 하위 구성 요소 해시 코드 구현을 재사용하는 것입니다.이 경우 큰 소수를 반환하는 것이 좋습니다.

관련 질문 :


1
나는 이것들이 충분히 크다고 생각합니다. 1보다 큰 gcd를 얻으려면 최소한 2*1231 = 2462버킷이 필요 합니다. 그러한 상황에서 충돌이 문제입니까?
aioobe 2010 년

2
int에 들어갈 수있는 것을 고려할 때 그들이 정말로 "상당히 큰"것은 아니지만 흥미 롭습니다. JDK Hashtable과 잘 작동 할만큼 충분히 크지 만 계산 비용을 최소화 할만큼 충분히 작다고 생각합니다.
Thilo

2
예, 그들이 그렇게 크지 않다는 것도 저에게 충격 받았습니다. 그러나 더 큰 소수에 더 높은 비용이 있다고 믿습니까?
aioobe 2010 년

3
당신은 그들이 충돌 것입니다 전에 1231 * 1237 = 1522747 버킷의 배수가 필요할 것 @Thilo, 그것은 충분히 큰 충분하다
래칫 괴물

2
버킷 수와의 충돌로 이어지는 것은 부울의 문제가 아니라 복합 객체의 해시 코드를 얻는 방법에 대한 일반적인 구성입니다.
Drunix

2

위에서 말한 모든 것 외에도 개발자의 작은 이스터 에그 일 수도 있습니다.

참 : 1231 => 1 + 2 + 3 + 1 = 7

7-유럽 전통에서 행운의 숫자입니다.

거짓 : 1237 => 1 + 2 + 3 + 7 = 13

13 (일명 Devil 's dozen)-불운 한 숫자.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.