【发布时间】: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)调用一个 laHash()(*graph_iterator)和Hash()(size_t),如果方便,默认为std::hash-es。不知道你为什么称它为乏味:非常简单......可能只有大约 10 行简单代码,具体取决于图形库。 -
我没有使用图形库,我说的是对象图。因此,我有一个对象,它有几个原始成员和几个指向其他对象的指针。这里使用的所有类/对象都是自定义的。我认为@sehe 所追求的更接近我正在寻找的东西,尽管我仍然难以理解他的答案。 ;)