可以考虑将单个int类型映射成3个uint64,再执行加减操作,从而实现将多个int的集合最终映射成3个uint64,通过比较这3个uint64是否相等来快速判断集合是否相同。
由于加法满足交换律,与顺序无法,因此上述做法天然支持多重集合。对于单重集合,可以考虑再加个set维护当前插入了哪些元素,已经有的元素就不需要再参与哈希了。
struct hval {
u64 h1, h2, h3;
u64 f1(u64 x) { return 1ULL * x * x * x * 1237123 + 19260817; }
u64 f2(u64 x) { return 1ULL * x * x * 3217321 + 71806291; }
u64 f3(u64 x) { return 1ULL * x * 1678931 + 74328249; }
void set(int x) {
h1 = f1(x & 0x7fffffff) + f1(x >> 31);
h2 = f2(x & 0x07ffffff) + f2(x >> 27);
h3 = f3(x & 0x00007fff) + f3(x >> 15);
}
hval(u64 a=0, u64 b=0, u64 c=0):h1(a), h2(b), h3(c) {}
bool operator==(const hval &rhs) const {
return h1 == rhs.h1 && h2 == rhs.h2 && h3 == rhs.h3;
}
friend hval operator+(const hval &a, const hval &b) {
return hval(a.h1 + b.h1, a.h2 + b.h2, a.h3 + b.h3);
}
friend hval operator-(const hval &a, const hval &b) {
return hval(a.h1 - b.h1, a.h2 - b.h2, a.h3 - c.h3);
}
};
标签:const,h2,hval,h1,u64,整型,哈希,h3
From: https://www.cnblogs.com/chenfy27/p/18471816