[c++] C++에서의 해시 함수 구현
해시 함수는 데이터를 고유한 정수 값으로 매핑하는 데 사용되는 중요한 개념입니다. C++에서는 해시 함수를 구현하는 여러 가지 방법이 있습니다. 이 포스트에서는 C++의 표준 라이브러리와 직접 구현하는 방법에 대해 살펴보겠습니다.
1. 표준 라이브러리의 해시 함수 사용
C++ 표준 라이브러리에는 해시 함수를 구현한 std::hash
템플릿이 포함되어 있습니다. 이를 사용하여 기본적인 데이터 형식들에 대한 해시 함수를 얻을 수 있습니다. 예를 들어, std::hash<int>
를 호출하면 int 형식의 해시 함수를 얻을 수 있습니다.
#include <iostream>
#include <functional>
int main() {
std::hash<int> intHash;
int key = 42;
size_t hashValue = intHash(key);
std::cout << "Hash value of " << key << " is " << hashValue << std::endl;
return 0;
}
2. 사용자 정의 해시 함수 구현
표준 라이브러리에 없는 특정한 데이터 형식에 대한 해시 함수를 구현해야 할 때, 사용자 정의 해시 함수를 만들어야 합니다. 이를 위해 std::hash
템플릿을 특수화(specialize)하거나 사용자 정의 클래스에 대해 operator()
를 오버로딩하여 해시 함수를 구현할 수 있습니다.
#include <iostream>
struct MyData {
int id;
std::string name;
};
struct MyDataHash {
size_t operator()(const MyData &data) const {
size_t hash = std::hash<int>()(data.id);
hash = hash ^ (std::hash<std::string>()(data.name) + 0x9e3779b9 + (hash << 6) + (hash >> 2));
return hash;
}
};
int main() {
MyData data = {123, "John Doe"};
MyDataHash hashFunc;
size_t hashValue = hashFunc(data);
std::cout << "Hash value of data is " << hashValue << std::endl;
return 0;
}
결론
C++에서는 기본적인 데이터 형식에 대한 해시 함수를 표준 라이브러리에서 제공하고 있습니다. 그러나 특정한 데이터 형식에 대한 해시 함수를 구현해야 할 때에는 사용자 정의 해시 함수를 만들어야 합니다. 해시 함수는 해시 테이블, 캐시, 데이터베이스 인덱싱 등과 같은 다양한 응용분야에서 유용하게 활용됩니다.
참고 문헌: