我最近试图找出比较两个大型XML文档的最快方法,一位同事建议对它们进行哈希处理,然后只比较哈希字符串。
起初,这似乎是一个明显/好主意!但后来本能地告诉我,这可能“太好了,不可能成真”。
就像序列化POJO进行比较/克隆被广泛认为是“不良做法”一样,对于这种技术来说也是如此吗?为什么或者为什么不?警告/陷阱等?
答案 0 :(得分:5)
首先我要说XML比较很棘手。这很棘手,因为你很好地把它放在问题的标题中,你正在比较XML实例。
XML不仅仅是内容(文本文件,二进制文件等),您可以比较它们以查看是否有不同之处; XML具有意义,不同的XML实例可以具有相同的含义。
例如,请考虑以下XML示例:
<sample a="foo" b="bar" />
这有什么不同吗?
<sample b='bar' a='foo' />
或者这个:
<sample
a="foo"
b="bar" />
甚至是这个?:
<sample a="foo" b="bar"></sample>
答案是样本都是平等的。但是如果你对每一个进行散列,你每次都会得到不同的哈希值。
如果要哈希XML实例并使用哈希进行比较,首先必须将它们放入a canonical form。如果XML不经常更改,您可以将XML存储在XML旁边,然后只比较哈希值。只有在发生变化时才计算消息摘要。这可能非常快。
另一个解决方案也是进行an XSLT转换并使用两个XML实例作为输入。然后输出更简单的东西(可能是包含所有元素和属性名称和值的平面文件),这比较容易。
评论中提到了lots of ways to compare XML个文件和@ violet313,这实际上取决于您想要进行比较的原因以及您想要比较的内容。
答案 1 :(得分:1)
计算哈希值需要读取整个文件,并花费CPU周期来计算它,那么为什么不进行字节比较,如果你不担心文件不同但在语义上相同呢?
此外,您引用的哈希值都存在问题(MD5更多),如果存在任何人可能有任何动机创建具有相同哈希值但又不同的文档的风险,则不应使用(这很容易与MD5一起使用)从加密的角度来看是完全被打破的,并且可能与SHA1的距离不远。
基本上你提出的建议(哈希然后比较哈希)可能比普通比较慢(除非你从一个真正寻求厌恶的媒体读取)并且有自己的问题。在XML文档的上下文中,您可能需要更高级别的方法,因为Bogdan几乎可以解决这个问题。