*최댓값 기계에 대한 구현은 따로 post 하겠음.
해시(hash)란 임의의 테이터에 해시함수를 이용하여 고정된 길이의 데이터(문자열 등)로 변환하는 것을 의미한다.
변환하는 과정 자체를 해싱, 변환된 값을 해쉬 값 라고도 부른다.
python 내장함수의 해싱 예시
파이썬 내장함수 hash()를 이용하여 임의의 값의 해시 값(정수)을 알 수 있다. 파이썬의 hash() 함수는 보안을 이유로 프로그램을 실행할 때마다 반환값이 달라진다.
해시를 이용하여 구현된 key-value store를 해시 테이블 또는 딕셔너리라고 한다.
좋은 해시함수는 중복되는 해시값이 최대한 없도록 하여 되도록 충돌이 발생하지 않는 함수이다.
그러나 해시 함수의 반환값의 경우 수는 유한하고, 입력값의 경우의 수는 무한하기 때문에 비둘기집의 원리에 의해 충돌은 어쩔 수 없이 발생한다.
비둘기집의 원리란? : n개의 비둘기 집에 (n+1)마리 비둘기를 한 집에 한 마리씩 넣는 것은 불가능하다는 원리를 말한다. 당연하가 n마리여야 가능한 전재이다.
그래서 해시충돌 해결방법으로 등장한 개념이 개별 체이닝!
key-value store의 각 인덱스를 '연결 리스트'로 만들어서 동일한 인덱스의 값들을 연결하는 방법이다. 아래 예에서는 동일한 인덱스(1)를 갖는 Elice와 Dodo 자로를 서로 연결하였다.
Linear Probing
해쉬 테이블 저장공간 안에서 충돌 문제를 해결하는 기법
오픈 어드레싱(open addressing)
충돌이 발생했을 때 자료를 저장하기 위해 빈 공간을 탐색하는 방식.
따라서 모든 원소가 자신의 해시 값과 일치하는 인덱스에 저장된다는 보장은 없다.
오픈 어드레싱에서 빈 공간을 찾는 방법은 여러가지가 있다. 하지만 간당하고 대표적인 방법은 선형 탐사 방식이다.
원래 인덱스의 다음 인덱스부터 탐색하여 가장 가까운 빈 공간을 찾는 방법이다.