diff --git a/trick/hash-structure.cpp b/trick/hash-structure.cpp new file mode 100644 index 0000000..6637f5a --- /dev/null +++ b/trick/hash-structure.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +template +struct VectorHash { + static void has_combine(size_t& seed, const T& v) { + seed ^= hash{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + } + + size_t operator() (const std::vector& vec) const { + size_t seed = 0; + for (const T& v : vec) { + has_combine(seed, v); + } + return seed; + } +}; + +struct TupleHash { + template + static void hash_combine(size_t& seed, const T& v) { + seed ^= hash{}(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); + } + + template + static void hash_tuple(size_t& seed, const Tuple& t) { + if constexpr (Index < tuple_size_v) { + hash_combine(seed, get(t)); + hash_tuple(seed, t); + } + } + + template + size_t operator()(const std::tuple& t) const { + size_t seed = 0; + hash_tuple(seed, t); + return seed; + } +}; + + +int main() { + std::unordered_set, VectorHash> hash_set1; + std::unordered_set, TupleHash> hash_set2; + return 0; +} \ No newline at end of file