3.4 C++ 해시 테이블
대부분의 응용 프로그램에서 룩업 연산은 매우 빈번하게 발생합니다. 그러나 해시 구현에서 항상 양의 정수만 취급할 수는 없습니다. 오히려 문자열 데이터를 다루게 되는 경우가 더 많습니다. 다시 영어 사전을 예로 들어보겠습니다. 영어 사전을 구현하려면 영어 단어를 키로 사용하고, 단어 뜻을 값으로 사용해야 합니다. 1장에서 언급했던 병원 기록 데이터베이스의 경우에도 환자 이름이 키가 되고, 환자와 관련된 정보는 값으로 취급해야 합니다.
정수로부터 해시 값을 계산하기 위해 사용했던 모듈로 함수는 문자열에는 적용할 수 없습니다. 간단한 해결책은 문자열의 모든 문자에 대한 ASCII 코드 값을 모두 더한 후에 모듈로 연산을 하는 것입니다. 그러나 같은 문자로 구성된 문자열이 너무 많아서 충돌이 빈번하게 발생할 수 있습니다.
C++는 문자열로부터 해시 값을 생성하는 용도로 std::hash<std::string>(std::string) 함수 객체를 제공합니다. 이 함수 객체 내부에는 해시 함수 알고리즘이 구현되어 있습니다. C++는 문자열 이외에도 모든 기본 데이터 타입에 대한 해시 값을 생성하는 기능도 제공합니다.
‘연습 문제 14: 체이닝을 사용하는 해시 테이블’에서 구현했던 해시 테이블 코드를 템플릿 형태로 바꾸면 모든 데이터 타입에 대해 사용할 수 있는 형태로 만들 수 있습니다. STL은 이러한 기능을 std::unordered_set<Key>와 std::unordered_map<Key, Value> 형태로 미리 구현하여 제공합니다. std::unordered_set은 키만 저장할 수 있고, std::unordered_map은 키와 값을 함께 저장할 수 있습니다.