해시는 임의의 길이를 가진 데이터를 고정된 길이의 데이터로 매핑하는 것을 말한다.
이 과정에서 원본 데이터를 키(Key), 매핑하는 과정을 해싱(Hashing), 결과 데이터를 해시값(Hash Value)이라한다.
그리고 이렇게 데이터를 해싱하는 함수를 해시 함수(Hash Function)라 한다.
해시 함수는 해시값의 보통 입력의 범위보다 출력 값의 범위가 좁은 경우가 많기 때문에 서로 다른 두 개의 키에 대해 동일한 해시값을 내는 해시 충돌이 발생할 수 있다.
이를 해결하기 위한 방법에는 분리 연결법과 개방 주소법이 존재한다.
분리 연결법은 충돌이 발생하면 Linked List를 사용해 연결된 새로운 공간을 사용하는 방법이다.
하지만 연결 리스트를 사용하기 때문에 추가적인 공간이 필요하고 메모리 문제가 발생할 수 있다.
연결 리스트는 검색 시 O(n) 걸리므로 같은 해시값을 갖는 데이터가 많아진다면 해시를 사용하는 이유가 사라진다.
개방 주소법은 충돌이 발생하면 다른 버킷을 사용하는 방법이다.
다른 버킷을 찾는 방법에는 대표적으로 3가지가 존재한다.
고정된 크기의 배열을 사용하므로 추가적인 공간을 필요로 하지 않는다.
데이터가 적을 때는 연속된 공간에서 빠르게 찾을 수 있기 때문에 분리 연결법보다 좋은 성능을 보인다.