hashCode() 내부 함수는 JVM.h에서 확인할 수 있다.
의 코드에서JVM_IHashCode 함수는
synchronizer.cpp 함수에서 사용을 확인할 수 있는데,
ObjetSynchronzier::FashHashCode
를 통해 hashCode 제작을 요청하는 모습을 볼 수 있다.
따라서 저 함수 내부를 보면
이러한 구조를 가지고 있는 것을 볼 수 있는데.
hash = mark.hash();
if ( hash != 0 ) {
return hash;
} // Hash 값을 보유하고 있으면 이러한 값을 바로 반환
만일 hash 값을 가지고 있지 않으면
hash = get_next_hash(current(Thread), obj);
을 통해서 새로운 해쉬값을 받아오란 코드를 볼 수 있다.
그렇다면 get_next_hash 는 어떠한 함수인지 내부를 함께 살펴보자.
hashCode 변수에 따라 생성 방법이 여러개가 있다는 것을 볼 수 있다.
이러한 변수는 JVM HashCode 생성 기법 초기화에 따라 다르지만
-XX:hashCode=<value>
설정 방법으로 설정할 수 있다.
일반적으로 1~4는 사용되지않고 기본값으로
else {
// Marsaglia's xor-shift scheme with thread-specific state
// This is probably the best overall implementation -- we'll
// likely make this the default in future releases.
unsigned t = current->_hashStateX;
t ^= (t << 11);
current->_hashStateX = current->_hashStateY;
current->_hashStateY = current->_hashStateZ;
current->_hashStateZ = current->_hashStateW;
unsigned v = current->_hashStateW;
v = (v ^ (v >> 19)) ^ (t ^ (t >> 8));
current->_hashStateW = v;
value = v;
}
이 방식을 통해서 hashCode 를 생성하는데, 이러한 값은 Marsaglia의 xor-shift 알고리즘에 따라 스레드 전용 상태 기반으로 하여 빠르게 난수를 생성하는 기법이다.
그리하여 Object Class 의 함수 생성 방식은 다음을 따르고 앞으로의 버젼에서도 1~4는 제외되며 이러한 방법이 사용된다.
만일 값이 1번 일 경우 메모리 주소값을 이용하여 값을 생성하고, 4번일 경우 메모리 주소값을 반환하기 때문에 반드시 HashCode 가 메모리 주소라는것은 알맞지 않다.
HashCode 생성 기법 설정을 JVM 을 통해 4번을 할 경우 메모리 주소를 그대로 반환할 수 있지만, 일반적으론 그렇지 않다.