La clase de plantilla std::hash en C++
-
Utilice
std::hash
para generar hash para los objetosstd::string
-
Utilice
std::hash
para generar hash para los objetosstd::bitset
-
Utilice
std::hash
para generar hash para los objetosstd::vector<bool>
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
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