类模板
<functional>

std::hash

template <class T> struct hash;
默认哈希函数对象类
定义了标准库所使用的默认哈希函数的单目函数对象类。

函数调用返回其参数的哈希值:哈希值是仅取决于其参数的值,对于相同的参数(在程序的给定执行中)总是返回相同的值。对于不同的参数,返回值应具有很小的相同概率(发生碰撞的几率接近 1/numeric_limits<size_t>::max)。

其他函数对象类型可以作为无序容器的 Hash 使用,前提是它们表现如上所述,并且它们至少是可复制构造可析构的函数对象。

默认的 hash 是一个模板类,对于一般情况没有定义。但所有库实现都至少提供以下类型特定的特化:

头文件类型
<functional>bool
char
signed char
unsigned char
char16_t
char32_t
wchar_t
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
float
double
long double
T* (对于任何类型 T)
<string>string
wstring
u16string
u32string
<memory>unique_ptr
shared_ptr
<vector>vector<bool>
<bitset>bitset
<system_error>error_code
<typeindex>type_index
<thread>thread::id

除了可调用具有相应类型参数的对象外,所有 hash 实例化的对象都是默认可构造可复制构造可复制赋值可析构并且可交换的。

用户可以为此模板提供具有相同属性的自定义特化。

成员类型

成员类型定义说明
result_typesize_t生成的哈希值类型。
argument_typeT作为参数的值的类型。

成员函数

operator()
size_t 类型的值返回其参数的哈希值。
size_t 是一个无符号整数类型。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// hash example
#include <iostream>
#include <functional>
#include <string>

int main ()
{
  char nts1[] = "Test";
  char nts2[] = "Test";
  std::string str1 (nts1);
  std::string str2 (nts2);

  std::hash<char*> ptr_hash;
  std::hash<std::string> str_hash;

  std::cout << "same hashes:\n" << std::boolalpha;
  std::cout << "nts1 and nts2: " << (ptr_hash(nts1)==ptr_hash(nts2)) << '\n';
  std::cout << "str1 and str2: " << (str_hash(str1)==str_hash(str2)) << '\n';

  return 0;
}

输出
same hashes:
nts1 and nts2: false
str1 and str2: true


异常安全

无异常保证:无成员抛出异常(这适用于库实现中提供的特化)。自定义特化可能提供不同的保证。