您是否在边缘存储索引或引用?如果你使用incides,就不会像琐碎的哈希函数一样
19 * index0 + 7 * index1
“足够好”?如果你的哈希值应该是对称的,那么我会考虑两个索引的简单异或,但是由于半边缘确实是直接的,你可能最好使用非对称哈希并专门寻找成对的边缘方向。
实际上比较两个边缘是一个相对便宜的操作(即比生成一个复杂的哈希便宜),碰撞并不像你看起来那样令人厌恶。
也就是说,根据我的经验。准备在这里被真正的哈希专家烧掉。 :-)
作为旁注:您可能希望通过删除确保哈希表实现是正确的,因为它可能会从表中删除您找到的任何配对边缘。
我很啰嗦
你可能想要解决这个问题。
边缘的一个简单方法是通过其两个顶点的索引。为了使其唯一,首先采用较小的索引,然后采用较大的索引。像这样的东西:
uint hash(const Vertex& v1, const Vertex& v2) { int i1 = v1.index; int i2 = v2.index; if (i1 > i2) swap(i1, i2); return (i1 | (i2 << 16)); }
在此哈希表指向的实际数据中,您可能希望跟踪您已经看到的哪一对以及您期望的哪一对(相反的一对)。