【问题标题】:C++ - Hash value of object graph similar to boost::serializationC++ - 类似于 boost::serialization 的对象图的哈希值
【发布时间】:2016-07-21 02:26:27
【问题描述】:

我刚刚阅读了这篇关于 boost::serialization 的 great article,它似乎非常聪明且易于使用。

我正在寻找一种以类似/简单的方式计算对象图的哈希值的方法。

有人知道如何实现吗?

【问题讨论】:

  • 很大程度上取决于您使用的图形库。如果您能够查询图并通过任何相同值/连线图和边/连接的某些表示获得一致有序的遍历,那么哈希函数和boost::hash_combine 的组合可以产生整体哈希。例如,让我们在有序遍历 O0、O1、O2 和 O3 以及边 0-1、O-3、1-2 中调用您的对象:您可以 hash_combine { hash(O0), hash(O1), hash(O2), hash(O3), hash(0), hash(1), hash(0), hash(3), hash(1), hash(2) } (或者甚至跳过索引的散列,如果您信任hash_combine足够了)。
  • @TonyD 这是一种繁琐的方法,它还将哈希算法硬编码到实现中。我不认为这就是他所追求的。我认为,他检测到的“聪明”将是我在答案中链接的“不知道类型#”的想法
  • @sehe:我无法想象你为什么认为执行上述操作需要对哈希算法进行任何硬编码......可以简单地提供说 template <class Hash> size_t hash(const Graph& g) 调用一个 la Hash()(*graph_iterator)Hash()(size_t) ,如果方便,默认为std::hash-es。不知道你为什么称它为乏味:非常简单......可能只有大约 10 行简单代码,具体取决于图形库。
  • 我没有使用图形库,我说的是对象图。因此,我有一个对象,它有几个原始成员和几个指向其他对象的指针。这里使用的所有类/对象都是自定义的。我认为@sehe 所追求的更接近我正在寻找的东西,尽管我仍然难以理解他的答案。 ;)

标签: c++ oop c++11 boost hash


【解决方案1】:

【讨论】:

  • 我不得不承认,我对 boost 很陌生,而且只有三个月的 C++ 经验。你的答案看起来确实很聪明,但我很难破译它。如果您能以更简单的方式解释它,将不胜感激。与此同时,我将继续努力理解。
  • 它只是通过序列化到一个二进制存档来进行中途,该二进制存档被写入一个假流(您可以使用boost::iostreams::tee 将ahs 序列化数据)。假流只是散列。当然,您可以插入 MD5、SAH1、Blake2、Fletcher2、Murmur 或其他任何东西。
  • 我称它为中途,因为拥有自定义存档会更干净。或者你不能“滥用”Boost Serialization 来进行调度并自己滚动,例如:stackoverflow.com/questions/27523771/… 如果你需要多态性并支持 Boost Serialization 附带的许多东西(容器、字符串、多索引容器、多精度数字、智能指针等)
  • 其实我的基本需求是指针(哈希它们背后的对象)、字符串、容器。所以要做到这一点:您建议使用基本的 boost::serialization 序列化所有内容,然后计算二进制结果的哈希值? (可能更聪明一点,有一个流(?),但这就是我的理解)
  • 好的,非常感谢。我现在将尝试应用我学到的知识并制作 SSCCE。也许我什至可以让它自己工作。你让我走得更远了。万分感谢!也许以后再见:)
猜你喜欢
  • 1970-01-01
  • 2021-06-27
  • 2012-05-02
  • 2012-06-02
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多