std::hash<Key>::operator()
Материал из cppreference.com
Специализации 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 для пользовательского класса. Хеш-функция использует алгоритм хэширования Фаулер-Нолл-Во.
Запустить этот код
#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
{
// вычисляет хэш сотрудника, используя вариант
// хеш-функции Фаулера-Нолла-Во
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