JAVA의 hashCode

아기코딩단2·2022년 1월 21일

해시코드란? 인스턴스의 고유한 값이다. 인스턴스의 주민등록번호라고 이해하고 있다. Object클래스의 toString을 subclass에서 overriding하지 않으면 toString 메서드 사용시 해시값을 출력한다. 뒤의 16진수가 해당 클래스의 해시값이다. Object의 equals는 객체의 주소를 비교하고 String과 wrapper class 의 equals는 Object의 toString 을 overring 하여 안에 있는 내용을 비교한다. 즉 같은 객체를 각각 new 명령어를 통해서 만들었을 경우 Score s = new Score(); 과 Score s1 = new Score();을 Object의 toString을 통해 비교할 경우 객체의 주소를 비교하기 때문에 false가 뜨게된다. 그러나 String의 equals 의 경우 안에 있는 문자열을 비교하기 때문에 true가 출력된다. 인스턴스가 달라도 hashcode의 값이 같을 수 있다.

그렇다면 hash값은 어떻게 만드는가? 여러가지 계산식이 존재하는데 MD4/MD5 ->128bit(16byte), SHA-1 -> 160bit(20byte), SHA-256 -> 256bit(32byte) 등이 존재한다. 그러나 해시값을 할당해줄 때 해시값이 같을 수 있는 확률이 있다. 당연하게도 해시값의 바이트가 클 수록 중복가능성이 줄어든다(경우의 수가 많기 때문) 그러나 단점으로는 해시값을 계산하는 시간이 더 걸린다. 즉 정리하자면 1. 중요데이터의 경우 시간이 더 걸리더라도 더 큰 해시값 사용하고, 2. 보통 데이터의 경우 속도가 빠른 해시알고리즘을 사용한다. 예를 들자면 중요데이터의 경우 사용자 인증서가 있고, 보통데이터의 경우 해시값이 작은 걸 사용한다.

해시값을 사용하게 되면 장점이 존재하는데 두 데이터를 같은지 검사할 때 원본- 복사본(처음부터 끝까지 1byte씩 값을 비교한다) 이 방법은 가장 완벽하지만 데이터가 클수록 오래걸린다.
두번째 방법은 프로그램을 돌려서 해시값을 출력해서 비교해서 검사한다. 이 방법은 해시값은 1MB도 안되기 때문에 비교가 빠르다.
이런식으로 해시값을 비교해보면 된다. 이렇게 비교했을 해시값이 같다면 원본과 복사본이 (거의)같다 라고 할 수 있다.

Object의 hashCode()는 인스턴스마다 고유의 식별값을 리턴하고 String의 hashCode()는 문자열을 가지고 해시값을 계산하고 문자열이 같다면 해시값도 같도록 리턴한다.

profile
레거시 학살자

0개의 댓글