我正在寻找std::vector
的哈希函数,它将独立于vector的项目的排序。
换句话说,我正在寻找哈希实现,
会给我相同的结果std::vector<int> v1(1,2,3);
std::vector<int> v2(2,3,1);
std::vector<int> v3(1,3,2);
关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
+
应该这样做。我们通过对称的+
收集哈希值。
^
优于^
,因为获得一个周期需要更长的时间。使用{1,1}
时,{2,2}
和+
会对相同的哈希值进行哈希处理(通常情况下偶数会“消失”)。使用unordered_map
代替它们。
因此,最终结果是对于数组中每个不同值的总和,该值的哈希值乘以其计数,mod“max(size_t)+1”。
请注意,==
需要哈希和相等。如果你想要碰撞,你还需要写一个struct unordered_equal {
template<class C>
bool operator()(C const& lhs, C const& rhs)const {
using std::begin;
using K = std::decay_t< *decltype(begin(lhs)) > >;
std::unordered_map< K, std::size_t > counts;
for (auto&& k : lhs) {
counts[k]++;
}
for (auto&& k : rhs) {
counts[k]--;
}
for (auto&& kv : counts)
if (kv.second != 0) return false;
return true;
}
};
。
.whl