aboutsummaryrefslogtreecommitdiff
path: root/src/common/hash.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/hash.h')
-rw-r--r--src/common/hash.h40
1 files changed, 8 insertions, 32 deletions
diff --git a/src/common/hash.h b/src/common/hash.h
index 40194d1ee..b2538f3ea 100644
--- a/src/common/hash.h
+++ b/src/common/hash.h
@@ -6,6 +6,8 @@
#include <cstddef>
#include <cstring>
+#include <utility>
+#include <boost/functional/hash.hpp>
#include "common/cityhash.h"
#include "common/common_types.h"
@@ -33,38 +35,12 @@ static inline u64 ComputeStructHash64(const T& data) {
return ComputeHash64(&data, sizeof(data));
}
-/// A helper template that ensures the padding in a struct is initialized by memsetting to 0.
-template <typename T>
-struct HashableStruct {
- // In addition to being trivially copyable, T must also have a trivial default constructor,
- // because any member initialization would be overridden by memset
- static_assert(std::is_trivial_v<T>, "Type passed to HashableStruct must be trivial");
- /*
- * We use a union because "implicitly-defined copy/move constructor for a union X copies the
- * object representation of X." and "implicitly-defined copy assignment operator for a union X
- * copies the object representation (3.9) of X." = Bytewise copy instead of memberwise copy.
- * This is important because the padding bytes are included in the hash and comparison between
- * objects.
- */
- union {
- T state;
- };
-
- HashableStruct() {
- // Memset structure to zero padding bits, so that they will be deterministic when hashing
- std::memset(&state, 0, sizeof(T));
- }
-
- bool operator==(const HashableStruct<T>& o) const {
- return std::memcmp(&state, &o.state, sizeof(T)) == 0;
- };
-
- bool operator!=(const HashableStruct<T>& o) const {
- return !(*this == o);
- };
-
- std::size_t Hash() const {
- return Common::ComputeStructHash64(state);
+struct PairHash {
+ template <class T1, class T2>
+ std::size_t operator()(const std::pair<T1, T2>& pair) const noexcept {
+ std::size_t seed = std::hash<T1>()(pair.first);
+ boost::hash_combine(seed, std::hash<T2>()(pair.second));
+ return seed;
}
};