2012-11-06 2 views
3

String과 System.Security.Cryptography.MD5를 사용하여 같은 문자열을 포함하는 파일에서 MD5 해시를 생성합니다. 그러나 해시 값은 다릅니다. 여기 MD5 해시가 FileStream과 문자열이 다른 이유 C#

문자열

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에서 답변을 찾을 수 없습니다.

어떤 아이디어?

+0

이, 해싱의 성능을 향상 (VAR 스트림 = 새로운 한 BufferedStream'같은 한 BufferedStream의 스트림을 포장하기 :

데이터의 시작 부분에 UTF-8 BOM을 추가하면 같은 해시를 줄 것이다 File.OpenRead (경로), 100000)' – Luuk

답변

6

데이터가 다르기 때문에 해시가 다릅니다.

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

또한, 파일이 BOM (byte order mark)를 포함 할 수 있습니다 : 동일한 결과를 얻을 수 바이트 문자열을 변환 할 UTF-8 인코딩을 사용한다, 그래서

파일은 UTF-8이 아닌 ASCII입니다 처음에는 이는 파일에 텍스트로 읽히지 않으므로 데이터에 포함됩니다.

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); 
+0

감사합니다. 당신이 말한 것처럼 이것은 효과적입니다. 이제 실제 문제는 클라이언트가 파일 해시를 검사하는 방법을 찾는 것입니다. – SneakyPeet

-1

공백과 줄 바꿈을 위해 파일에서 문자열을 잘라 냈습니까?

관련 문제