散列std :: vector独立于项目顺序

时间:2016-11-13 19:07:29

标签: c++ c++11 vector hash

我正在寻找std::vector的哈希函数,它将独立于vector的项目的排序。

换句话说,我正在寻找哈希实现,

会给我相同的结果
std::vector<int> v1(1,2,3);
std::vector<int> v2(2,3,1);
std::vector<int> v3(1,3,2); 

关于如何实现这一目标的任何想法?

1 个答案:

答案 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