Namespaces
Variants

std::hash<Key>::operator()

cppreference.net에서 가져옴
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 비권장됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
교환 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
공통 어휘 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 

다음을 만족하는 std::hash의 특수화는 operator()을 정의해야 합니다:

  • 타입 key의 단일 인수 Key를 받습니다.
  • std::size_t 타입의 값을 반환하며, 이는 key의 해시 값을 나타냅니다.
  • 동일한 두 매개변수 k1와 k2에 대해, std::hash<Key>()(k1) == std::hash<Key>()(k2)입니다.
  • 동일하지 않은 서로 다른 두 매개변수 k1와 k2에 대해, std::hash<Key>()(k1) == std::hash<Key>()(k2)일 확률은 매우 작아서 1.0 / std::numeric_limits<size_t>::max()에 가까워야 합니다.

매개변수

key - 해시될 객체

반환값

해시 값을 나타내는 std:: size_t 입니다.

예외

해시 함수는 예외를 던지지 않아야 합니다.

예제

다음 코드는 사용자 정의 클래스에 대해 std::hash 템플릿을 특수화하는 방법을 보여줍니다. 해시 함수는 Fowler–Noll–Vo 해시 알고리즘을 사용합니다.

#include <cstdint>
#include <functional>
#include <iostream>
#include <string>
struct Employee
{
    std::string name;
    std::uint64_t ID;
};
namespace std
{
    template <>
    class hash<Employee>
    {
    public:
        std::uint64_t operator()(const Employee& employee) const
        {
             // computes the hash of an employee using a variant
             // of the Fowler-Noll-Vo hash function
             constexpr std::uint64_t prime{0x100000001B3};
             std::uint64_t result{0xcbf29ce484222325};
             for (std::uint64_t i{}, ie = employee.name.size(); i != ie; ++i)
                 result = (result * prime) ^ employee.name[i];
             return result ^ (employee.ID << 1);
         }
    };
}
int main()
{
    Employee employee;
    employee.name = "Zaphod Beeblebrox";
    employee.ID = 42;
    std::hash<Employee> hash_fn;
    std::cout << hash_fn(employee) << '\n';
}

출력:

12615575401975788567