C++의 std::hash 템플릿 클래스

Jinku Hu 2023년10월12일
  1. std::hash를 사용하여 std::string 객체에 대한 해시 생성
  2. std::hash를 사용하여 std::bitset 객체에 대한 해시 생성
  3. std::hash를 사용하여 std::vector<bool> 객체에 대한 해시 생성
C++의 std::hash 템플릿 클래스

이 기사에서는 C++에서 STL의 std::hash 템플릿 클래스를 소개합니다.

std::hash를 사용하여 std::string 객체에 대한 해시 생성

std::hash 템플릿 클래스는 STL <functional> 헤더 아래에 제공됩니다. 해시 함수 객체를 생성합니다. std::hashDefaultConstructible 유형의 요구 사항을 충족하며 템플릿 인수만 제공하면 됩니다.

이 템플릿 클래스의 여러 기본 특수화는 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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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