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

< cpp‎ | utility‎ | hash

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

- 接收单个 `key` 类型的参数 `Key` 。
- 返回表示 `key` 哈希值的 std::size_t 类型值。
- 对于二个相等的参数 `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 模板。

    #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