Eine gute hash-Funktion für einen Vektor
Habe ich einige Vektor von integer, die ich speichern möchten effizient in einer unordered_map in c++11 meine Frage ist:
Wie kann ich Sie am besten speichern Sie diese und optimieren Sie für .find
Abfragen?
Ich kam mit der folgenden hasher:
class uint32_vector_hasher {
public:
std::size_t operator()(std::vector<uint32_t> const& vec) const {
std::size_t ret = 0;
for(auto& i : vec) {
ret ^= std::hash<uint32_t>()(i);
}
return ret;
}
};
und speichern Sie dann die Objekte in eine unordered_map
ich haben jedoch ein paar Fragen
- wie oft wird der hash berechnet bekommen, nur eine, einige zufällige Anzahl oder die Zeiten?
- Würde es Sinn machen, erstellen Sie ein wrapper-Objekt mit
==
- und hash-Funktionen zu machen, merken Sie sich den hash und vermeiden Sie berechnet werden, mehr als einmal?
Beim profiling ich habe bemerkt, dass eine ziemlich große Menge von meinem cpu-Zeit verbringen zu tun lookups auf die ungeordneten Karten, das ist nicht gerade optimal 🙁
InformationsquelleAutor der Frage Martin Kristiansen | 2013-12-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Immer gehen Sie mit dem Experten, wenn möglich:
http://www.boost.org/doc/libs/release/doc/html/hash/reference.html#boost.hash_combine
InformationsquelleAutor der Antwort RichardPlunkett
So, wenn Sie nicht wollen, um boost, Michael Unschärfe Kommentar führte zu der folgenden hash-Funktion Implementierung:
Scheint zu funktionieren.
InformationsquelleAutor der Antwort HolKann