C++의 std::hash 템플릿 클래스
-
std::hash
를 사용하여std::string
객체에 대한 해시 생성 -
std::hash
를 사용하여std::bitset
객체에 대한 해시 생성 -
std::hash
를 사용하여std::vector<bool>
객체에 대한 해시 생성
이 기사에서는 C++에서 STL의 std::hash
템플릿 클래스를 소개합니다.
std::hash
를 사용하여 std::string
객체에 대한 해시 생성
std::hash
템플릿 클래스는 STL <functional>
헤더 아래에 제공됩니다. 해시 함수 객체를 생성합니다. std::hash
는 DefaultConstructible
유형의 요구 사항을 충족하며 템플릿 인수만 제공하면 됩니다.
이 템플릿 클래스의 여러 기본 특수화는 C++ 표준 라이브러리에서 제공되며 전체 목록은 여기에서 볼 수 있습니다. 주어진 템플릿 인수로 해시 함수 객체가 생성되면 단일 인수를 받아들이고 size_t
값을 반환하는 operator()
를 사용하여 특정 해시 값을 생성하는 데 사용할 수 있습니다.
다음 예에서는 string
전문화를 사용하고 임의의 문자열에 대한 일부 해시 값을 생성합니다.
#include <functional>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
using std::string;
int main() {
string str1("arbitrary string");
std::vector<string> vec2 = {"true", "false", "false",
"true", "false", "true"};
std::hash<string> str_hash;
cout << "hash(str1) - " << str_hash(str1) << endl;
cout << "hash(vec2 elements) - ";
for (const auto &item : vec2) {
cout << str_hash(item) << ", ";
}
cout << endl;
return EXIT_SUCCESS;
}
출력:
hash(str1) - 3484993726433737991
hash(vec2 elements) - 1325321672193711394, 3658472883277130625, 3658472883277130625, 1325321672193711394, 3658472883277130625, 1325321672193711394,
std::hash
를 사용하여 std::bitset
객체에 대한 해시 생성
STL에서 제공되는 std::hash
의 또 다른 전문화는 std::bitset
인수에 대한 것입니다. std::bitset
은 고정된 수의 비트를 시퀀스로 나타내는 클래스이며 쉬운 비트 조작을 위해 여러 멤버 함수를 제공합니다.
일반적으로 std::hash
전문화에서 사용하는 해시 함수는 구현에 따라 다르며 이러한 개체를 해시 문제에 대한 보편적인 솔루션으로 사용해서는 안 됩니다. 또한 이러한 해시 함수는 프로그램의 단일 실행 내에서 동일한 입력에 대해 동일한 출력을 생성하는 데만 필요합니다.
#include <bitset>
#include <functional>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
using std::string;
int main() {
std::bitset<8> b1("00111001");
std::hash<std::bitset<8>> bitset_hash;
cout << "hash(bitset<8>) - " << bitset_hash(b1) << endl;
return EXIT_SUCCESS;
}
출력:
hash(bitset<8>) - 6623666755989985924
std::hash
를 사용하여 std::vector<bool>
객체에 대한 해시 생성
다음 코드 스니펫과 같이 부울 값의 벡터
에 std::hash
특수화를 사용할 수도 있습니다. std::hash
는 사용자 정의 클래스에 대해 특수화될 수도 있으며 일부 추가 특수화는 Boost 라이브러리를 통해 사용할 수 있습니다(자세한 내용은 여기에 나열됨).
#include <functional>
#include <iomanip>
#include <iostream>
using std::cout;
using std::endl;
using std::setw;
using std::string;
int main() {
std::vector<bool> vec1 = {true, false, false, true, false, true};
std::hash<std::vector<bool> > vec_str_hash;
cout << "hash(vector<bool>) - " << vec_str_hash(vec1) << endl;
return EXIT_SUCCESS;
}
출력:
hash(vector<bool>) - 12868445110721718657
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook