std::hash<Key>::operator()
De cppreference.com
Una especialización de std::hash deberá definir un operador, operator() tal que:
- Tome un solo argumento
keyde tipoKey. - Devuelva un valor de tipo
size_tque represente el valor hash dekey. - Para dos parámetros
k1yk2que sean iguales,std::hash<Key>()(k1) == std::hash<Key>()(k2). - Para dos parámetros distintos
k1yk2que no sean iguales, la probabilidad questd::hash<Key>()(k1) == std::hash<Key>()(k2)deberá ser muy pequeña, acercándose a1.0/std::numeric_limits<size_t>::max().
Parámetros
| key | - | El objeto a ser resumido (hashed). |
Valor de retorno
Un tipo size_t que representa el valor hash.
Excepciones
Las funciones hash no deberán lanzar excepciones.
Ejemplo
El siguiente código muestra cómo especializar la plantilla std::hash para una clase personalizada.
Ejecuta este código
#include <functional>
#include <iostream>
#include <string>
struct Empleado {
std::string nombre;
unsigned int ID;
};
namespace std {
template <>
class hash<Empleado> {
public:
size_t operator()(const Empleado &empleado) const
{
// Calcula el hash de un empleado usando una variante
// de la función hash Fowler-Noll-Vo
size_t result = 2166136261;
for (size_t i = 0, ie = empleado.nombre.size(); i != ie; ++i) {
result = (result * 16777619) ^ empleado.nombre[i];
}
return result ^ (empleado.ID << 1);
}
};
}
int main()
{
Empleado empleado;
empleado.nombre = "Pancho Lopez";
empleado.ID = 42;
std::hash<Empleado> hash_fn;
std::cout << hash_fn(empleado) << '\n';
}
Salida:
177237019