c++ - 具有关联属性的 boost::hash_combine 的替代方案?

标签 c++ boost hashcode

我正在寻找具有关联属性的 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函数吗?

P.S.:这样做的原因是我将散列键分配给在 DAG 中找到的序列。我正在运行动态编程来查找所有状态对(之间的序列)的哈希键。

最佳答案

普通异或怎么样?

std::size_t seed = 0;
seed ^= boost::hash_value(234);
seed ^= boost::hash_value(62);
...

关于c++ - 具有关联属性的 boost::hash_combine 的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6038105/

相关文章:

c++ - 使用 std :array via template non-type argument? 初始化 Boost 直方图 Axis

c++ - 将 Python 嵌入到 C++ 应用程序中

Java:只检查不可变对象(immutable对象)的equals()中的hashCode

c# - 关于如何正确覆盖 object.GetHashCode() 的一般建议和指南

c++ - Memcpy 崩溃取决于指针类型

c++ - 如何在 C++ 中通过 system() 函数使用字符串变量

c++ - 如果出现问题,需要 curl_easy_cleanup() 吗?

c++ - "multiple template parameter lists are not allowed"?

c++ - 使用 boost::asio::async_read 失败但 boost::asio::read 有效(我正在使用 io_stream.run_one())

java - 为什么 hashcode() 返回一个整数而不是长?