3

System.Security.Cryptography.MD5 を使用して、文字列と同じ文字列を含むファイルから MD5 ハッシュを生成します。ただし、ハッシュ値は異なります。

文字列から生成するコードは次のとおりです

byte[] data = Encoding.ASCII.GetBytes("The quick brown fox jumps over the lazy dog");
byte[] hash = MD5.Create().ComputeHash(data);
return BitConverter.ToString(hash).Replace("-", "").ToLower();

そして、ファイルからハッシュを生成するときのコードは次のとおりです

internal static string CalculateFileHashTotal(string fileLocation) 
    {
        using(var md5 = MD5.Create())
        {
            using (var stream = File.OpenRead(fileLocation))
            {
                byte[] b = md5.ComputeHash(stream);
                stream.Close();
                return BitConverter.ToString(b).Replace("-", "").ToLower();
            }
        }
    }

文字列からのハッシュは正しいので、ファイルからのハッシュは余分なものを読み取るか、ファイル全体を読み取らないと思います。Googleで答えが見つかりませんでした。

何か案は?

4

2 に答える 2

6

データが異なるため、ハッシュが異なります。

ファイルは ASCII ではなく UTF-8 であるため、同じ結果を得るには、UTF-8 エンコーディングを使用して文字列をバイトに変換する必要があります。

byte[] data = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog");

また、ファイルの先頭にBOM (バイト オーダー マーク)が含まれている場合があります。ファイルはテキストとして読み取られないため、これはデータに含まれます。

データの先頭に UTF-8 BOM を追加すると、同じハッシュが得られます。

byte[] bom = { 239, 187, 191 };
byte[] data = Encoding.UTF8.GetBytes("The quick brown fox jumps over the lazy dog");

byte[] bomdata = new byte[bom.Length + data.Length];
bom.CopyTo(bomdata, 0);
data.CopyTo(bomdata, bom.Length);
byte[] hash = MD5.Create().ComputeHash(bomdata);
于 2012-11-06T06:53:51.847 に答える
-1

ファイルから文字列の空白と改行を削除しましたか?

于 2012-11-06T06:52:34.583 に答える