좋은 해쉬 함수는 - 현실에서는 키들이 랜덤하지 않다. - 만약 키들의 통계적 분포에 대해 알고 있다면, 이를 이용하여 해쉬 함수를 고안하는 것이 가능하겠지만 현실적으로 어렵다. - 키들이 어떤 특정한 (가시적인) 패턴을 가지더라도 해쉬함수값이 불규칙적이 되도록 하는 것이 바람직하다 -> 예시로 사람 이름이 Z로 시작하는 사람이 적고 A로 시작하는 사람이 많은 것 처럼 : 해쉬함수값이 키의 특정 부분에 의해서만 결정되지 않아야 한다. 해쉬함수 Division 기법 h(k) = k mod m (사실 모든 해쉬함수들이 마지막에 하는 일 -> 마지막에 변환하는 일) ex) m = 20 and k = 91 -> h(k) = 11 장점 : 한번의 mod연산으로 계산, 따라서 빠름 단점 : 어떤 m 값에 대해서는 해쉬 함수값이 키값의 특정 부분에 의해서 결정되는 경우가 있음. 가령 m = 2^p 이면 키의 하위 p비트가 해쉬 함수값이 된다. 보통 이 전 단계에서 복잡한 과정을 거쳐서 마지막 과정에 division 기법 적용해서 사용하는데, 이전 단계에서 Multiplication 기법이나 기타등등을 통해서 사용 - 0에서 1 사이의 상수 A를 선택 : 0<A<1 (소수) - kA의 소수 부분만을 택한다 - 소수 부분에 m을 곱한 후 소수점 아래를 버린다. Hash code in Java - java의 Object 클래스는 hashCode() 메서드를 가진다. 따라서 모든 클래스는 hashcode()메소드를 상속받는다. 이 메소드는 하나의 32비트 정수를 반환한다. x.equals(y)이면 x.hashcode()==y.hashcode()이다. 하지만 역은 성립하지 않는다. Object 클래스의 hashCode()메소드는 객체의 메모리 주소를 반환하는 것으로 알려져 있다. 필요에 따라 각 클래스마다 이 메소드를 override 해서 사용한다. -> 이거 hashcode() 함수 사용해서 해시값 비교할 때