Java Hashcode = Memory address? ( Java 해시 코드는 메모리 주소인가? )

seon.woo·2024년 5월 14일
1

Java HashCode

HashCode 는 어디로부터 오는가?

  • 모든 사용자 정의 클래스는 Object Class 를 상속하고 있기 때문에 Object Class 내의 메서드들을 포함하고 있다. 따라서 모든 클래스(Primitive 변수 제외)는 hashCode() 메서드를 가지고 있고 따로 오버라이딩 하지 않는 이상

    다음의 내용에 따른다.

HashCode 란?

  • Object Class 의 hashCode() 에 따르면 hashCode 는 '어플리케이션 내의 같은 객체임을 증명하는 숫자값' 임을 말하고 있다. 따라서 객체의 동일성 여부를 확인하는 equals() 메서드에도 hashCode 를 사용함을 알 수 있다.

HashCode 는 Memory Address 인가?

  • 동일 어플리케이션 내부의 같은 객체의 동일성을 판단하는 척도라고 해서 '반드시' 이 값의 저장소가 메모리 주소를 의미하는 것은 아니다.

#1 Object Class hashCode() 는 Native 함수로서 이러한 함수 내부는 .h C언어로 구현된다.

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 는 어떠한 함수인지 내부를 함께 살펴보자.

#2 HashCode 생성 방식

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 가 메모리 주소라면, 오버라이딩을 못하게 하는것이 당연지사아닌가?

결론

HashCode 생성 기법 설정을 JVM 을 통해 4번을 할 경우 메모리 주소를 그대로 반환할 수 있지만, 일반적으론 그렇지 않다.

profile
선돌이

0개의 댓글