
Hashing은 효율적으로 자료를 저장하고 가져오기위한 자료구조입니다.
이것은 키값을 해쉬함수를 통해 자료를 저장할 특정 인덱스를 구하고 해당 인덱스에 자료를 저장합니다. 궁극적으로 키 값과 자료가 매핍되는 것입니다.
Key
Key는 해쉬 함수에 들어가는 값으로 Value값이 저장될 인덱스를 결정하게 됩니다.
Hash Function
Hash Function은 Key를 입력 값으로 받고 인덱스를 반환합니다.
Hash Table
해쉬 테이블은 자료 구조로 키와 값을 매핍합니다.
해쉬는 데이터들을 각 데이터의 고유한 인덱스에 저장합니다.
우리가 사용자 정보를 가지고 있다고 가정해봅시다.
각 사용자의 정보는 다음과 같습니다.
{
{ name: 'ab', age: 15, sex: 'male' },
{ name: 'cd', age: 16, sex: 'female' },
{ name: 'efg', age: 17, sex: 'male' }
}
우리는 사용자 이름을 기반으로 age와 sex에 대한 정보를 가져오고 싶습니다.
그렇기 때문에 사용자 이름은 Key가 됩니다.
이를 염두에 두고 다음과 같은 절차를 밟으면 됩니다.
1. 각 키에 해당하는 수 구하기
a는 1 b는 2 c는 3 ... 형식으로 각 알파벳에 숫자를 부여한다고 하겠습니다.
그럼 이름 문자열은 아래와 같은 값을 가지게 됩니다.
“ab” = 1 + 2 = 3,
“cd” = 3 + 4 = 7 ,
“efg” = 5 + 6 + 7 = 18
“ab” in 3 mod 7 = 3,
“cd” in 7 mod 7 = 0,
“efg” in 18 mod 7 =4
이렇게 구한 값은 인덱스가 됩니다.
이를 이용해서 정보를 저장하면 아래와 같이 인덱스에 각 이름에 대한 정보가 들어가게 됩니다.

충돌이란 어떤 값을 Hash Function을 이용해 인덱스를 구했을 때 해당 인덱스에 이미 다른 값이 저장되어 있을 경우를 말합니다.
즉, 서로 다른 키 값이 Hash Function을 통해 반환 된 인덱스 값이 같은 것입니다.
Chaining
해당 인덱스안에 배열로 값들을 여러 개 저장하는 것입니다.
서로 다른 키 값에 대해 같은 인덱스를 반환하면 배열에 같이 저장하는 것입니다.
Open Addressing
Linear Probing
충돌이 일어날 경우 순차적으로 다음 인덱스에 값이 들어갈 수 있는지 검토하고 들어갈 수 있으면 들어갑니다.
Quadratice Probing
충돌이 일어날 경우 특정 수에 제곱한만큼 인덱스를 이동해 값이 들어갈 수 있는지 검토하고 들어갈 수 있으면 들어갑니다.
Double Hashing
충동이 일어날 경우 해싱을 한번 더 한 뒤 인덱스를 구합니다.