#include <iostream>
#include <unordered_set>
namespace std {
template<>
struct hash<unordered_multiset<int>> {
typedef unordered_multiset<int> argument_type;
typedef std::size_t result_type;
const result_type BASE = static_cast<result_type>(0xA67);
result_type log_pow(result_type ex) const
{
result_type res = 1;
result_type base = BASE;
while (ex > 0)
{
if (ex % 2)
res = res * base;
base *= base;
ex /= 2;
}
return res;
}
result_type operator()(argument_type const & val) const {
result_type h = 0;
for (const int& el : val) {
h += log_pow(el);
}
return h;
}
};
};
int main() {
std::unordered_set<std::unordered_multiset<int>> mySet;
std::unordered_multiset<int> set1{1,2,3,4};
std::unordered_multiset<int> set2{1,1,2,2,3,3,4,4};
std::cout << "Hash 1: " << std::hash<std::unordered_multiset<int>>()(set1) << std::endl;
std::cout << "Hash 2: " << std::hash<std::unordered_multiset<int>>()(set2) << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KCm5hbWVzcGFjZSBzdGQgewoJdGVtcGxhdGU8PgoJc3RydWN0IGhhc2g8dW5vcmRlcmVkX211bHRpc2V0PGludD4+IHsKCQl0eXBlZGVmIHVub3JkZXJlZF9tdWx0aXNldDxpbnQ+IGFyZ3VtZW50X3R5cGU7CgkJdHlwZWRlZiBzdGQ6OnNpemVfdCByZXN1bHRfdHlwZTsKCQkKCQljb25zdCByZXN1bHRfdHlwZSBCQVNFID0gIHN0YXRpY19jYXN0PHJlc3VsdF90eXBlPigweEE2Nyk7CgkJCgkJcmVzdWx0X3R5cGUgbG9nX3BvdyhyZXN1bHRfdHlwZSBleCkgY29uc3QKCQl7CgkJICAgIHJlc3VsdF90eXBlIHJlcyA9IDE7CgkJICAgIHJlc3VsdF90eXBlIGJhc2UgPSBCQVNFOwoJCSAgICB3aGlsZSAoZXggPiAwKQoJCSAgICB7CgkJICAgICAgICBpZiAoZXggJSAyKQoJCSAgICAgICAgICAgIHJlcyA9IHJlcyAqIGJhc2U7CgkJICAgICAgICBiYXNlICo9IGJhc2U7CgkJICAgICAgICBleCAvPSAyOwoJCSAgICB9CgkJICAgIHJldHVybiByZXM7CgkJfQoJCQoJCXJlc3VsdF90eXBlIG9wZXJhdG9yKCkoYXJndW1lbnRfdHlwZSBjb25zdCAmIHZhbCkgY29uc3QgewoJCQlyZXN1bHRfdHlwZSBoID0gMDsKCQkJZm9yIChjb25zdCBpbnQmIGVsIDogdmFsKSB7CgkJCQloICs9IGxvZ19wb3coZWwpOwoJCQl9CgkJCXJldHVybiBoOwoJCX0KCX07Cn07CgoJaW50IG1haW4oKSB7CgkJc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PGludD4+IG15U2V0OwoJCXN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PGludD4gc2V0MXsxLDIsMyw0fTsKCQlzdGQ6OnVub3JkZXJlZF9tdWx0aXNldDxpbnQ+IHNldDJ7MSwxLDIsMiwzLDMsNCw0fTsKCQlzdGQ6OmNvdXQgPDwgIkhhc2ggMTogIiA8PCBzdGQ6Omhhc2g8c3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQ8aW50Pj4oKShzZXQxKSA8PCBzdGQ6OmVuZGw7CgkJc3RkOjpjb3V0IDw8ICJIYXNoIDI6ICIgPDwgc3RkOjpoYXNoPHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PGludD4+KCkoc2V0MikgPDwgc3RkOjplbmRsOwoJCXJldHVybiAwOwoJfQ==