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

Jinku Hu 12 octubre 2023
  1. Utilice std::hash para generar hash para los objetos std::string
  2. Utilice std::hash para generar hash para los objetos std::bitset
  3. Utilice std::hash para generar hash para los objetos std::vector<bool>
La clase de plantilla std::hash en C++

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook