Die std::hash-Vorlagenklasse in C++
- 
          
            Verwenden Sie std::hash, um Hash fürstd::string-Objekte zu generieren
- 
          
            Verwenden Sie std::hash, um Hash fürstd::bitset-Objekte zu generieren
- 
          
            Verwenden Sie std::hash, um Hash fürstd::vector<bool>-Objekte zu generieren
 
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
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