2013-05-01 13 views

Odpowiedz

17

Można użyć MD5CryptoServiceProvider, który będzie współpracować z plików tekstowych oraz plików binarnych.

byte[] myFileData = File.ReadAllBytes(myFileName); 
byte[] myHash = MD5.Create().ComputeHash(myFileData); 

... Lub jeśli pracujesz z dużymi plikami i nie chcesz, aby załadować cały plik do pamięci:

byte[] myHash; 
using (var md5 = MD5.Create()) 
using (var stream = File.OpenRead(myFileName)) 
    myHash = md5.ComputeHash(stream); 

można porównać do tablic bajtowych z dwóch plików z Enumerable.SequenceEqual:

myHash1.SequenceEqual(myHash2); 

Można również spróbować utworzyć kalkulator CRC. Zobacz: http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net

+1

Czy konieczne jest przekonwertowanie całego pliku na tablicę bajtów? – svick

+0

@svick: Zaktualizowałem swoją odpowiedź. Dzięki za wejście! –

+0

@MartinMulder, czy mogę używać słownika do przechowywania skrótu i ​​porównywać go przez TryGetValue?)) Haszysz hash)) –

4

Należy szukać lepiej;)

using System.IO; 
using System.Text; 
using System.Security.Cryptography; 


protected string GetMD5HashFromFile(string fileName) 
{ 
    FileStream file = new FileStream(fileName, FileMode.Open); 
    MD5 md5 = new MD5CryptoServiceProvider(); 
    byte[] retVal = md5.ComputeHash(file); 
    file.Close(); 

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < retVal.Length; i++) 
    { 
    sb.Append(retVal[i].ToString("x2")); 
    } 
    return sb.ToString(); 
} 

Przeciągnij plik do tej funkcji tak.

GetMD5HashFromFile("text1.txt"); 
GetMD5HashFromFile("text2.txt"); 
+1

Czy konieczne jest przekształcenie całej tablicy bajtów w ciąg znaków? Wydaje mi się, że muszę trochę popracować, żeby porównać te dwa hashe. –

+2

Powinieneś użyć 'using' w strumieniu zamiast jawnie wywoływać' Close() '. – svick