Espacios de nombres
Variantes

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

De cppreference.com
 
 
Biblioteca de servicios
Apoyo del lenguaje
Apoyo de tipos (tipos básicos, RTTI)
Macros de prueba de característica de la biblioteca (C++20)
Servicios de programa
Funciones variádicas
Apoyo de corrutinas (C++20)
Apoyo de contratos (C++26)
Comparación de tres vías (C++20)
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

 
 

Una especialización de std::hash deberá definir un operador, operator() tal que:

  • Tome un solo argumento key de tipo Key.
  • Devuelva un valor de tipo size_t que represente el valor hash de key.
  • Para dos parámetros k1 y k2 que sean iguales, std::hash<Key>()(k1) == std::hash<Key>()(k2).
  • Para dos parámetros distintos k1 yk2 que no sean iguales, la probabilidad que std::hash<Key>()(k1) == std::hash<Key>()(k2) deberá ser muy pequeña, acercándose a 1.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.

#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