具有关联属性的 boost::hash_combine 的替代方案

Alternatives to boost::hash_combine that have associative property?

本文关键字:combine 方案 hash 属性 boost 关联      更新时间:2023-10-16

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

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

普通异或怎么样?

std::size_t seed = 0;
seed ^= boost::hash_value(234);
seed ^= boost::hash_value(62);
...
相关文章: