Die std::hash-Vorlagenklasse in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie std::hash, um Hash für std::string-Objekte zu generieren
  2. Verwenden Sie std::hash, um Hash für std::bitset-Objekte zu generieren
  3. Verwenden Sie std::hash, um Hash für std::vector<bool>-Objekte zu generieren
Die std::hash-Vorlagenklasse in C++

Dieser Artikel stellt die Template-Klasse std::hash aus STL in C++ vor.

Verwenden Sie std::hash, um Hash für std::string-Objekte zu generieren

Die Template-Klasse std::hash wird unter dem STL-Header <functional> bereitgestellt. Es erstellt ein Hash-Funktionsobjekt. std::hash erfüllt die Anforderungen des Typs DefaultConstructible und erfordert nur, dass ein Template-Argument bereitgestellt wird.

Mehrere Standardspezialisierungen dieser Vorlagenklasse werden in der C++-Standardbibliothek bereitgestellt, und die vollständige Liste kann hier eingesehen werden. Sobald das Hash-Funktionsobjekt mit dem angegebenen Vorlagenargument erstellt wurde, kann es verwendet werden, um mithilfe von operator(), das ein einzelnes Argument akzeptiert und den Wert size_t zurückgibt, spezifische Hash-Werte zu generieren.

Im nächsten Beispiel verwenden wir die string-Spezialisierung und generieren einige Hash-Werte für beliebige Strings.

#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;
}

Ausgabe:

hash(str1) - 3484993726433737991
hash(vec2 elements) - 1325321672193711394, 3658472883277130625, 3658472883277130625, 1325321672193711394, 3658472883277130625, 1325321672193711394,

Verwenden Sie std::hash, um Hash für std::bitset-Objekte zu generieren

Eine weitere Spezialisierung von std::hash in der STL ist für std::bitset-Argumente. Denken Sie daran, dass std::bitset die Klasse ist, die eine feste Anzahl von Bits als Sequenz darstellt und mehrere Member-Funktionen für eine einfache Bit-Manipulation bereitstellt.

Im Allgemeinen sind die von std::hash-Spezialisierungen verwendeten Hashfunktionen implementierungsabhängig, und man sollte diese Objekte nicht als universelle Lösung für Hashing-Probleme verwenden. Außerdem sind diese Hash-Funktionen nur erforderlich, um dieselbe Ausgabe für dieselbe Eingabe innerhalb einer einzigen Ausführung des Programms zu erzeugen.

#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;
}

Ausgabe:

hash(bitset<8>) - 6623666755989985924

Verwenden Sie std::hash, um Hash für std::vector<bool>-Objekte zu generieren

Wir können auch die Spezialisierung std::hash für einen Vektor von booleschen Werten verwenden, wie im folgenden Codeausschnitt gezeigt. Beachten Sie, dass std::hash auch für benutzerdefinierte Klassen spezialisiert werden kann und einige zusätzliche Spezialisierungen über die Boost-Bibliothek verfügbar sind (Details dazu sind hier aufgeführt).

#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;
}

Ausgabe:

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