2

私は最近、2 つの大きな XML ドキュメントを比較する最速の方法を見つけようとしていましたが、同僚はそれらをハッシュしてからハッシュ文字列を比較することを勧めました。

最初は、これは明白で素晴らしいアイデアのように思えました。しかし、何かが本能的に「本当であるにはあまりにも良い」かもしれないと私に言った.

比較/クローン作成のために POJO をシリアライズすることが広く「悪い習慣」と見なされているように、この手法にも同じことが当てはまりますか? なぜですか、そうでないのですか?警告/落とし穴など?

4

2 に答える 2

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 インスタンスをハッシュ化し、そのハッシュを比較に使用する場合は、まずそれらを正規の形式にする必要があります。XML が頻繁に変更されない場合は、ハッシュを XML と一緒に保存してから、ハッシュを比較するだけです。何かが変更された場合にのみ、メッセージ ダイジェストを計算します。これは非常に高速です。

もう 1 つの解決策は、XSLT変換を行い、2 つの XML インスタンスを入力として使用することです。次に、比較が簡単な、より単純なもの (すべての要素と属性の名前と値を含むフラット ファイルなど) を出力します。

XML ファイルを比較する方法はたくさんあります。@violet313 がコメントで述べたように、比較する理由と正確に何を比較したいかによって異なります。

于 2012-04-13T18:27:53.957 に答える
1

ハッシュを計算するには、とにかくファイル全体を読み取り、それを計算するためにCPUサイクルを費やす必要があります。したがって、ファイルが異なっていても意味的に同一であることが心配でない場合は、バイト間の比較を行ってみませんか?

また、引用した両方のハッシュに問題があり(MD5の方が多い)、同じハッシュであるが異なるドキュメントを作成するインセンティブが誰かにある可能性がある場合は使用しないでください(これは完全に壊れているMD5で簡単に実行できます)暗号化の観点から、そしておそらくSHA1)からそう遠くない。

基本的に、あなたが提案するもの(ハッシュしてからハッシュを比較する)は、単純な比較よりも遅くなる可能性があり(本当に嫌いなメディアから読んだ場合を除く)、独自の問題があります。それとXMLドキュメントのコンテキストでは、Bogdanがほとんどそれを釘付けにしているので、より高レベルのアプローチが必要になる可能性があります。

于 2012-04-16T16:53:07.213 に答える