高速なファイル整合性検証
-
19-09-2019 - |
質問
内容全体を読み取ることなく、2 つのファイルを (検証目的で) 比較できる高速アルゴリズムはありますか?
解決
あなたは両方のファイルにMD5ハッシュを使用して、彼らにそのように比較することができます。しかし、それは技術的にファイル全体を読み込むん。あなたは、私は考えていない確認せずに100%の確信を持ってすることはできません。
C#では1は、以下の方法(申し訳ありませんが、あなたが特定の言語については言及しなかった)でこれを行うだろう
protected string GetMD5HashFromFile(string fileName)
{
byte[] retVal = { };
using (FileStream file = new FileStream(fileName, FileMode.Open))
using (MD5 md5 = new MD5CryptoServiceProvider())
{
retVal = md5.ComputeHash(file);
}
if (retVal.Length > 0)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
else
{
return string.Empty;
}
}
bool CompareFiles(string fileName1, string fileName2)
{
return (GetMD5HashFromFile(fileName1) == GetMD5HashFromFile(fileName2));
}
他のヒント
あなたは、ファイルのビットを読み取るカスタムCRC手順を記述することができます。例えば代わりに、ファイル全体をCRCingのようなすべての1Kか何かのために16バイト。データはおそらくあなたが見ていない場所を変更して、比較されたブロックに影響を与えることができなかったので、それは、当然のことながら、リスクの高いです。しかし、CRCは、2つの非常に異なるデータセットが同じ値を返すことができますあまりにので、少し危険です。
あなたはすべてのバイトを読んでない限り、ファイルが同じで100%確認すべきアルゴリズムはありません。証明は簡単である - このようなアルゴリズムが存在すると仮定して、我々は2つのファイルを比較するためにそれを使用します。それは数バイトがアルゴリズムによって読み込まれていません意味します。私は、このアルゴリズムは、他の一つのファイルにそれらのバイトを変更することにより、失敗ではなく、することがあります。
同じサイズの 2 つのファイルが両方とも完全に読み込まれない限り等しいかどうかを判断することは数学的に不可能ですが、それらが等しいかどうかを判断することは非常に可能です。 等しくない 両方を完全に読まなくても。これは、ハッシュ関数の使用や短絡比較など、さまざまな方法で実行できます。
私は、あなたは彼らが等しいなら完全に確認するために、両方のファイルの完全な読み取りを避けることができないんです。
あなたはまず、両方のファイルのサイズを確認することができます。それらが異なるなら、ファイルが異なっている(のみ行区切りに異なるでしょうテキストファイルについてはどう?)ます。
サイズが同じであれば、私はさらに行くが、両方のファイルを読むために開始する任意の正しい方法が表示されません。もちろん、それは、すぐにバッファが異なるように停止することができますが、それが唯一のファイルは、の本当にのことは記載されてできたときに処理されています。
のように最後の文字に等しく