2012-04-13 16 views
2

最近、大規模な2つのXML文書を比較し、協力者がそれらをハッシュし、ハッシュ文字列を比較する最も速い方法を見つけようとしていました。MD5/SHA1を使用してXMLインスタンスを比較する

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

比較/クローニングのためにPOJOをシリアル化するのと同じように、「悪い習慣」と広くみなされていますが、この技術でも同じですか?なぜ、なぜそうではないのですか?警告/落とし穴など?

+0

鈍い音がする危険性がありますが、なぜそれを比較したいのかということが本当にあります。例:変更を記録する必要があるバックアップシステムの場合、ハッシュを取ることはOKです。 2つのファイルが同じか異なっているかを知るために、バイト比較のためのバイトは非常に高速です(最初のバイトは異なります)。[Rabin-Karp](http://en.wikipedia。 org/wiki/Rabin-Karp_string_search_algorithm)はO(n)です – violet313

答えて

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に沿ってハッシュを格納し、次にハッシュを比較するだけです。何かが変更された場合にのみ、メッセージダイジェストを計算します。これは非常に高速です。

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

ファイルにはlots of ways to compare XMLがあり、コメントには@ violet313が記載されています。なぜそれを比較したいのか、そして正確に何を比較したいのかによって変わります。ハッシュを計算

+0

私は素晴らしい答えを感謝します!私は、XMLインスタンスがXStreamによって生成されたので、同じPOJOが同じXMLに変換され、同じハッシュ値にマップされていない限り、* should *する必要があります。だから私はこれが私たちにとって問題ではないと思っていますが、非常にうまくいきました! – IAmYourFaja

1

はとにかくファイル全体を読み込む必要があり、それを計算するCPUサイクルを費やすので、あなたは、ファイルを別のまだ意味的に同じであることについて心配していない場合は、なぜ比較をバイトをバイトをしませんか?

また、あなたが引用したハッシュにも問題があります(MD5がもっとそうです)。同じハッシュを持つ文書を作成するためのインセンティブを誰かが持っている可能性がある場合は使用しないでください(これはMD5暗号の観点から完全に壊れていて、SHA1と遠く離れていない可能性があります)。そして、独自の問題を持っている(あなたが本当に嫌うメディアを求めてから読んでない限り)

は基本的に、あなたが(ハッシュを比較し、その後ハッシング)を提案するものを比較プレーンよりも可能性が遅くなります。 XML文書の文脈では、Bogdanがかなり釘付けになっているので、より高度なアプローチが望まれます。

関連する問題