JAVA/Hash, HashCode

JAVA Objects.hash() vs Objects.hashCode() 비교 분석

수달하나 2022. 11. 3. 21:00

혼자 공부할 때는 해시코드를 이용해서 값을 생성할 경우가 없었는데 실제 실무에서 확인해보면 해시코드를 사용해서 키 값을 만들어 내는 경우가 있었다.

해시코드를 공부하던 도중 Objects.hash 함수와 Objects.hashCode 함수 값을 통해서 해시코드를 생성할 수 있다는 것을 알았는데 그럼 둘의 차이는 무엇일까?

위와 같이 null 값, 0 값 그리고 0이 아닌 다른 수를 통해서 hash 값을 생성한 결과 아래와 같은 결과를 얻을 수 있었다.

Objects.hashCode() 의 경우 null값 과 0의 결과 값이 0으로 모두 동일했고 Objects.hash() 의 경우 null 값이 0값의 해시값과 동일한 결과를 보여줬다.

또 두 함수의 차이점은 0과 null이 아닌 다른 값을 집어 넣더라도 다른 결과값을 반환한다는 것을 알 수 있었다. 


또 Objects.hash() 의 경우에는 리스트 형태의 파라미터를 통해서 해시 코드를 생성할 수 있다.

객체 타입과 int 타입, 그리고 String 타입의 값을 순서를 변경해서 집어넣어 해시코드를 생성한 결과 아래와 같이 다른 해시값이 반환되는것을 확인 할 수 있었다.

결과적으로 Objects.hash() 함수는 파라미터의 순서에 영향을 받는 해시코드를 생성해 내는것을 알 수 있었다. 이것은 타입과는 무관한 얘기이므로 파라미터들의 타입이 같다고 하더라도 순서가 다르다면 다른 해시코드를 반환해 내는 것도 확인을 했다. 


사실 Objects.hash() 함수를 살펴보면 반환값이 hashCode의 Array 형태이다.

따라서 hashCode() 함수를 따라가 보면 for문을 돌면서 해시코드가 계산되고 객체의 순서가 반환되는 해시코드에 영향을 준다는것을 알 수 있었다.

추가적으로 null을 넣었을 때 왜 0 이 반환되는지 부터 위에서 확인했던 결과 값에 대한 해답을 여기서 확인할 수 있다.