C++ 散列无序容器而不需要实现类型的比较运算符

C++ 散列无序容器而不需要实现类型的比较运算符,c++,hash,boost-functional,C++,Hash,Boost Functional,我想散列一个无序容器,比如unordered\u映射和unordered\u集。 对于有序类型,如向量,boost::hash_range(v.begin().v.end())运行良好,但它也依赖于顺序,例如 #include <boost/functional/hash.hpp> #include <functional> namespace std { template<> struct hash<std::vector<int

我想散列一个无序容器,比如
unordered\u映射
unordered\u集
。 对于有序类型,如向量,
boost::hash_range(v.begin().v.end())
运行良好,但它也依赖于顺序,例如

#include <boost/functional/hash.hpp>
#include <functional>
namespace std {
    template<>
    struct hash<std::vector<int>> {
        size_t operator ()(const std::vector<int>& v) const noexcept {
            return boost::hash_range(v.begin(), v.end());
        }
    };
}
#包括
#包括
名称空间标准{
模板
结构散列{
size_t运算符()(const std::vector&v)const noexcept{
返回boost::hash_范围(v.begin(),v.end());
}
};
}
此工作模式的示例:

如果要计算数据的哈希值,则 数据在比较中并不重要(例如,一组),您必须 确保数据始终以相同的顺序提供

好的,这看起来很简单——只是以某种方式对数据进行排序,但我不想每次对数据进行哈希运算时都这样做。使用正常的
映射
集合
可以工作,但我需要重新编写一些代码


此外,这将要求我使用的每种类型都具有
这一要求似乎相当合乎逻辑,因为哈希函数以某种方式将前面的元素哈希与当前元素哈希相结合,因此顺序很重要,因为

H(A,B,C)
然后被计算为
H(H(A,B),C)
,这样每个中间结果都被用作下一个元素的输入(考虑分组密码)


要在不考虑排序的情况下对元素序列进行散列,您需要一个可交换散列函数,因此只能使用可交换操作(例如XOR)。我不确定这样的散列函数有多强,但对于您的特定场景,它就足够了。

您可以尝试对向量的元素进行散列,然后对这些散列进行排序,然后对已排序的散列集进行散列。另一方面:您不允许为
std::hash
创建专门化。此外,如果使用排序容器,则只需实现
operator@TedLyngmo你说的第一点是什么意思?我有一个有效的例子。对于第二个,我编辑了这篇文章,以澄清只需要一个。@Doot您在专门化中没有程序定义的类型,因此不允许将它放在
std
中。对于第二部分:您只需要
operator,除非您预期会发生拒绝服务攻击,否则不要认为哈希强度很重要。即使这样,在散列中添加一个简单的随机盐也可能会防止问题的发生。