我正在寻找一种具有可交换性质的hash_combine
函数。
例如,我希望能够将值a、b、c、d依次组合以获得序列的哈希键,或者将a和b组合,然后将c和d组合,再将结果组合。这两种方法应该得到相同的结果。
boost::hash_combine
没有这个属性:
// a * b * c * d
std::size_t seed = 0;
boost::hash_combine(seed, 234);
boost::hash_combine(seed, 62);
boost::hash_combine(seed, 675);
boost::hash_combine(seed, 916);
std::cout << seed << std::endl; // 706245846748881
// (a * b) * (c * d)
std::size_t seed1 = 0;
boost::hash_combine(seed1, 234);
boost::hash_combine(seed1, 62);
std::size_t seed2 = 0;
boost::hash_combine(seed2, 675);
boost::hash_combine(seed2, 916);
boost::hash_combine(seed1, seed2); // 11337801211148
有没有好的 hash_combine
函数呢?
附注:我这样做的原因是我将哈希键分配给在DAG中找到的序列。我正在运行动态规划,为所有状态对之间的(序列)寻找哈希键。
hash_combine
的行为相比,可能发生碰撞等方面的情况吗? - Frankboost::hash_combine
所使用的确切公式。 - Baffe Boyoisboost::hash_combine
的参考资料,它说seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
。 - Frank