해시코드란? 인스턴스의 고유한 값이다. 인스턴스의 주민등록번호라고 이해하고 있다. 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()는 문자열을 가지고 해시값을 계산하고 문자열이 같다면 해시값도 같도록 리턴한다.