以以下树为例:
O / \ / \ O O /|\ | / | \ | O O O O / \ / \ O O
每个 O 代表树的一个节点,是任意对象,具有关联的哈希函数。问题归结为:给定树结构节点的哈希码和已知结构,如何计算整个树的(相对)无冲突哈希码的算法?
关于哈希函数的几点说明:
- 哈希函数应依赖于树中每个节点的哈希码及其位置。 - 重新排列节点的子节点应明显更改生成的哈希码。 - 反转树上的任何部分应明显更改生成的哈希码。
如果有帮助的话,我在我的项目中使用C# 4.0,尽管我主要正在寻找理论解决方案,因此伪代码、描述或其他命令式语言中的代码都可以。
public override int GetHashCode()
{
int hashCode = unchecked((this.Symbol.GetHashCode() * 31 +
this.Value.GetHashCode()));
for (int i = 0; i < this.Children.Count; i++)
hashCode = unchecked(hashCode * 31 + this.Children[i].GetHashCode());
return hashCode;
}
这种方法的好处在于哈希码可以被缓存,只有在节点或其后代更改时才重新计算。(感谢vatine和Jason Orendorff指出这一点)。无论如何,如果我的建议解决方案做得不错,那就太好了,否则,欢迎任何可能的改进意见。