La classe de modèle std::hash en C++
-
Utilisez
std::hash
pour générer un hachage pour les objetsstd::string
-
Utilisez
std::hash
pour générer un hachage pour les objetsstd::bitset
-
Utilisez
std::hash
pour générer un hachage pour les objetsstd::vector<bool>
Cet article présentera la classe de modèle std::hash
de STL en C++.
Utilisez std::hash
pour générer un hachage pour les objets std::string
La classe de modèle std::hash
est fournie sous l’en-tête STL <functional>
. Il crée un objet fonction de hachage. std::hash
satisfait aux exigences du type DefaultConstructible
, et il suffit de fournir un argument de modèle.
Plusieurs spécialisations par défaut de cette classe de modèle sont fournies dans la bibliothèque standard C++, et la liste complète peut être consultée ici. Une fois que l’objet fonction de hachage est créé avec l’argument de modèle donné, il peut être utilisé pour générer des valeurs de hachage spécifiques à l’aide de operator()
qui accepte un seul argument et renvoie la valeur size_t
.
Dans l’exemple suivant, nous utilisons la spécialisation string
et générons des valeurs de hachage pour des chaînes arbitraires.
#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;
}
Production:
hash(str1) - 3484993726433737991
hash(vec2 elements) - 1325321672193711394, 3658472883277130625, 3658472883277130625, 1325321672193711394, 3658472883277130625, 1325321672193711394,
Utilisez std::hash
pour générer un hachage pour les objets std::bitset
Une autre spécialisation de std::hash
fournie dans la STL concerne les arguments std::bitset
. N’oubliez pas que std::bitset
est la classe qui représente un nombre fixe de bits sous forme de séquence et qu’elle fournit plusieurs fonctions membres pour une manipulation facile des bits.
Généralement, les fonctions de hachage utilisées par les spécialisations std::hash
dépendent de l’implémentation, et il ne faut pas utiliser ces objets comme solution universelle au problème de hachage. De plus, ces fonctions de hachage ne sont nécessaires que pour produire la même sortie pour la même entrée au cours d’une seule exécution du programme.
#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;
}
Production:
hash(bitset<8>) - 6623666755989985924
Utilisez std::hash
pour générer un hachage pour les objets std::vector<bool>
Nous pouvons également utiliser la spécialisation std::hash
pour un vecteur
de valeurs booléennes, comme indiqué dans l’extrait de code suivant. Notez que std::hash
peut également être spécialisé pour les classes définies par l’utilisateur, et certaines spécialisations supplémentaires sont disponibles via la bibliothèque Boost (dont les détails sont répertoriés ici.
#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;
}
Production:
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