C ++:如何从几个可散列成员计算哈希值?

时间:2014-11-13 17:42:37

标签: c++ hash hashcode

假设我有一个C ++类

class T {
  Type1 member1;
  Type2 member2;
  Type3 member3;
  unsigned long hash() {
    // How to implement?
  }
};

假设每个成员散列哈希函数member.hash()。实现类hash的{​​{1}}函数的最佳方法是什么? Java有一个特定于此任务的T类,C ++中有对应的吗?

我知道一种可能的解决方案可能是

HashCodeBuilder

这通常是一个很好的哈希函数吗?我应该如何选择常数17,37等,尤其是如果我超过3名成员?

另一个小问题是假设我的一个成员是原始类型(member1.hash() + member2.hash() * 17 + member3.hash() * 37 intfloat等),我应该如何从中生成哈希值?

2 个答案:

答案 0 :(得分:3)

Boost对此有所帮助:hash_combine

size_t seed = 0;
boost::hash_combine(seed, member1);
boost::hash_combine(seed, member2);
boost::hash_combine(seed, member3);
return seed;

答案 1 :(得分:0)

如果您使用std中的无序容器,您可以考虑http://en.cppreference.com/w/cpp/utility/hash

中的示例给出的方式
std::size_t operator()(S const& s) const 
{
    std::size_t h1 = std::hash<std::string>()(s.first_name);
    std::size_t h2 = std::hash<std::string>()(s.last_name);
    return h1 ^ (h2 << 1);
}