La classe de modèle std::hash en C++

Jinku Hu 12 octobre 2023
  1. Utilisez std::hash pour générer un hachage pour les objets std::string
  2. Utilisez std::hash pour générer un hachage pour les objets std::bitset
  3. Utilisez std::hash pour générer un hachage pour les objets std::vector<bool>
La classe de modèle std::hash en C++

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
Auteur: 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