SMB共有間でファイルをコピーする、サポートされていない非常に古いプログラムがあります。コピー前にファイルの内容が変更されたかどうかを判断するためのチェックサム アルゴリズムがあります。アルゴリズムは簡単にだまされているようです。2 つのファイルが 1 つの '1' が '2' に変わることを除いて同一であり、同じチェックサムを返す例を見つけました。アルゴリズムは次のとおりです。
unsigned long GetFileCheckSum(CString PathFilename)
{
FILE* File;
unsigned long CheckSum = 0;
unsigned long Data = 0;
unsigned long Count = 0;
if ((File = fopen(PathFilename, "rb")) != NULL)
{
while (fread(&Data, 1, sizeof(unsigned long), File) != FALSE)
{
CheckSum ^= Data + ++Count;
Data = 0;
}
fclose(File);
}
return CheckSum;
}
私はあまりプログラマーではありません (私はシステム管理者です) が、XOR ベースのチェックサムがかなり雑になることは知っています。このアルゴリズムが、同じサイズで内容が異なる 2 つのファイルに対して同じチェックサムを返す可能性はどれくらいですか? (正確な答えは期待していません。「リモート」または「かなり可能性が高い」で問題ありません。)
パフォーマンスに大きな影響を与えることなく、どうすれば改善できるでしょうか?
最後に、 ? はどうなっていfread()
ますか? ドキュメントを簡単にスキャンしましたが、理解できませんでした。Data
ファイルの各バイトに順番に設定されていますか? 編集:わかりました。ファイルをチャンクに読み込みますunsigned long
(ここでは32ビットOSを想定しましょう)。各チャンクには何が含まれていますか? ファイルの内容が の場合、最初のパスabcd
の値は? Data
それですか(Perlで):
(ord('a') << 24) & (ord('b') << 16) & (ord('c') << 8) & ord('d')