假设我有一个对象树,每个对象都有一个字符串表示。我想在整个树上创建一个SHA1摘要。
最简单的方法是以递归方式遍历树的每个节点。对于每个节点,我将连接所有子节点的SHA1摘要(作为简单字符串),将给定节点的字符串表示添加到此连接字符串,并对其执行SHA1。这将是给定节点的SHA1摘要。
问题是这个摘要是否会像“好”一样,好像我会连接子节点的字符串表示,而不是子节点的摘要?
由于
答案 0 :(得分:2)
这比散列孩子的连接要好。考虑以下树:
连接时,变为“AAAB”。与以下树形成对比:
不同,但串联的哈希值是相同的。
答案 1 :(得分:1)
假设您可以选择节点标签中从不允许的Unicode字符。
然后,您可以使用流API(如Java MessageDigest)类以树顺序提供所有标签,并在其间插入保留的分隔符。
最后,你有一个相对紧凑的摘要,无需支付额外的SHA计算水平。
修改强>
上面的方案并不完全正确,但是,原来的问题也是如此,因为它不会对树的结构进行编码。代码需要为每个节点构建某种ID,这种ID不仅仅是遍历顺序,并且包含在节点的哈希输入中,因此具有不同形状但相同标签的树不会相同地散列。
如果树顺序很重要但结构不精确,那么答案中的原始方案是有效的。