A classe de modelo std::hash em C++
-
Use
std::hash
para gerar Hash para objetosstd::string
-
Use
std::hash
para gerar Hash para objetosstd::bitset
-
Use
std::hash
para gerar Hash para objetosstd::vector<bool>
Este artigo irá apresentar a classe de modelo std::hash
de STL em C++.
Use std::hash
para gerar Hash para objetos std::string
A classe de modelo std::hash
é fornecida sob o cabeçalho STL <functional>
. Ele cria um objeto de função hash. std::hash
satisfaz os requisitos do tipo DefaultConstructible
e requer apenas o fornecimento de um argumento de modelo.
Várias especializações padrão desta classe de modelo são fornecidas na biblioteca padrão C++, e a lista completa pode ser vista aqui. Uma vez que o objeto de função hash é criado com o argumento do template fornecido, ele pode ser utilizado para gerar valores hash específicos usando operator()
que aceita um único argumento e retorna o valor size_t
.
No próximo exemplo, usamos a especialização string
e geramos alguns valores hash para strings arbitrárias.
#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;
}
Produção:
hash(str1) - 3484993726433737991
hash(vec2 elements) - 1325321672193711394, 3658472883277130625, 3658472883277130625, 1325321672193711394, 3658472883277130625, 1325321672193711394,
Use std::hash
para gerar Hash para objetos std::bitset
Outra especialização de std::hash
fornecida no STL é para argumentos std::bitset
. Lembre-se de que std::bitset
é a classe que representa um número fixo de bits como uma sequência e fornece várias funções de membro para fácil manipulação de bits.
Geralmente, as funções hash usadas por especializações std::hash
são dependentes da implementação, e não se deve usar esses objetos como uma solução universal para o problema de hash. Além disso, essas funções hash são necessárias apenas para produzir a mesma saída para a mesma entrada em uma única execução do 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;
}
Produção:
hash(bitset<8>) - 6623666755989985924
Use std::hash
para gerar Hash para objetos std::vector<bool>
Também podemos usar a especialização std::hash
para um vetor
de valores booleanos, conforme mostrado no seguinte trecho de código. Observe que std::hash
também pode ser especializado para classes definidas pelo usuário, e algumas especializações adicionais estão disponíveis através da biblioteca Boost (os detalhes estão listados aqui.
#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;
}
Produção:
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