HOWTO · C++

La clase de plantilla std::hash en C++

Este artículo explica varios casos de uso de la clase de plantilla std::hash en C++

En esta página

Este artículo presentará la clase de plantilla std::hash de STL en C++.

Utilice std::hash para generar hash para los objetos std::string

La clase de plantilla std::hash se proporciona bajo el encabezado STL <functional>. Crea un objeto de función hash. std::hash satisface los requisitos del tipo DefaultConstructible, y solo requiere que se proporcione un argumento de plantilla.

Se proporcionan múltiples especializaciones predeterminadas de esta clase de plantilla en la biblioteca estándar de C++, y la lista completa se puede ver aquí. Una vez que se crea el objeto de función hash con el argumento de plantilla dado, se puede utilizar para generar valores hash específicos usando operator() que acepta un solo argumento y devuelve el valor size_t.

En el siguiente ejemplo, usamos la especialización string y generamos algunos valores hash para cadenas arbitrarias.

#include <functional>
#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  string str1("arbitrary string");
  std::vector<string> vec2 = {"true", "false", "false",
                              "true", "false", "true"};

  std::hash<string> str_hash;

  cout << "hash(str1) - " << str_hash(str1) << endl;

  cout << "hash(vec2 elements) - ";
  for (const auto &item : vec2) {
    cout << str_hash(item) << ", ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Producción :

hash(str1) - 3484993726433737991
hash(vec2 elements) - 1325321672193711394, 3658472883277130625, 3658472883277130625, 1325321672193711394, 3658472883277130625, 1325321672193711394,

Utilice std::hash para generar hash para los objetos std::bitset

Otra especialización de std::hash proporcionada en STL es para argumentos std::bitset. Recuerde que std::bitset es la clase que representa un número fijo de bits como una secuencia, y proporciona múltiples funciones miembro para una fácil manipulación de bits.

Generalmente, las funciones hash utilizadas por las especializaciones std::hash dependen de la implementación, y no se deben usar estos objetos como una solución universal al problema de hash. Además, estas funciones hash solo se requieren para producir la misma salida para la misma entrada dentro de una sola ejecución del programa.

#include <bitset>
#include <functional>
#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  std::bitset<8> b1("00111001");

  std::hash<std::bitset<8>> bitset_hash;

  cout << "hash(bitset<8>) - " << bitset_hash(b1) << endl;

  return EXIT_SUCCESS;
}

Producción :

hash(bitset<8>) - 6623666755989985924

Utilice std::hash para generar hash para los objetos std::vector<bool>

También podemos usar la especialización std::hash para un vector de valores booleanos, como se muestra en el siguiente fragmento de código. Tenga en cuenta que std::hash también se puede especializar para clases definidas por el usuario, y algunas especializaciones adicionales están disponibles a través de la biblioteca Boost (cuyos detalles se enumeran aquí).

#include <functional>
#include <iomanip>
#include <iostream>

using std::cout;
using std::endl;
using std::setw;
using std::string;

int main() {
  std::vector<bool> vec1 = {true, false, false, true, false, true};

  std::hash<std::vector<bool> > vec_str_hash;

  cout << "hash(vector<bool>) - " << vec_str_hash(vec1) << endl;

  return EXIT_SUCCESS;
}

Producción :

hash(vector<bool>) - 12868445110721718657