xml - 使用 MD5/SHA1 比较 XML 实例

标签 xml hash comparison md5

我最近试图找出比较两个大型 XML 文档的最快方法,一位同事建议对它们进行散列处理,然后只比较散列字符串。

起初这似乎是一个显而易见/绝妙的想法!但后来我本能地告诉我,这可能“好得令人难以置信”。

就像序列化 POJO 进行比较/克隆被广泛认为是“不好的做法”一样,这种技术也是如此吗?为什么或者为什么不?注意事项/陷阱等?

最佳答案

首先让我说 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 一起存储,然后只比较散列。仅当某些内容发生变化时才计算消息摘要。这可能非常快。

另一个解决方案也是 an XSLT转换并使用两个 XML 实例作为输入。然后,您输出更简单的内容(可能是包含所有元素和属性名称和值的平面文件),比较简单。

lots of ways to compare XML文件和评论中提到的@violet313,这实际上取决于你为什么要进行比较以及你到底想比较什么。

关于xml - 使用 MD5/SHA1 比较 XML 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10140091/

相关文章:

检索 xml 数据的 C# 代码

xml - 使用 XSL 将 XML 节点替换为新节点

java - 比较目录以检查一个目录是否是另一个目录的子目录

c++ - 如何处理 "signed/unsigned mismatch"警告 (C4018)?

r - 我可以缩写 df[ !is.na(df$val) & df$val > 15] 吗?

java - 如何解析 XML 以从中返回 Map?

java - 生成漂亮的 JAXB 类

c++ - 有效检查 C++ 中 float 组的值变化

delphi - Delphi 2009 最高效的 Unicode 哈希函数

Perl:创建哈希时程序崩溃