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