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

来自cppreference.com
< cpp‎ | utility‎ | hash
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
std::hash
hash::operator()
 

std::hash 的特化应定义满足下列条件的 operator()

  • 接收单个 key 类型的参数 Key
  • 返回表示 key 哈希值的 std::size_t 类型值。
  • 对于二个相等的参数 k1k2std::hash<Key>()(k1) == std::hash<Key>()(k2)
  • 对于二个相异而不等的参数 k1k2std::hash<Key>()(k1) == std::hash<Key>()(k2) 的概率应该非常小,接近 1.0/std::numeric_limits<size_t>::max()

参数

key - 要被哈希的对象

返回值

表示哈希值的 std::size_t

异常

哈希函数不应抛异常。

示例

下列代码演示如何为自定义类特化 std::hash 模板。

#include <functional>
#include <iostream>
#include <string>
 
struct Employee {
  std::string name;
  unsigned int ID;
};
 
namespace std {
template <>
class hash<Employee> {
 public:
  size_t operator()(const Employee &employee) const
  {
    // 用 Fowler-Noll-Vo hash 哈希函数的变体计算 employee 的哈希
    size_t result = 2166136261;
 
    for (size_t i = 0, ie = employee.name.size(); i != ie; ++i) {
      result = (result * 16777619) ^ 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';
}

输出:

177237019