2013-05-01 22 views

cevap

17

Metin tabanlı dosyaları yanı sıra ikili dosyaları ile çalışacak MD5CryptoServiceProvider, kullanabilirsiniz.

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

Veya ... Büyük dosyalar ile çalışmak ve belleğe tüm dosyayı yüklemek istemiyorsanız: Sen Enumerable.SequenceEqual iki dosyalarından bayt dizileri için karşılaştırabilirsiniz

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

:

myHash1.SequenceEqual(myHash2); 

Ayrıca bir CRC hesap makinesi oluşturmayı da deneyebilirsiniz. Bkz: http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net

+1

Tüm dosyayı bir bayt dizisine dönüştürmek gerçekten gerekli mi? – svick

+0

@svick: Cevabımı güncelledim. Giriş için teşekkürler! –

+0

@MartinMulder, hash'ı saklamak ve TryGetValue ile karşılaştırmak için Sözlük kullanabilir miyim?)) Hash'ın hash değeriyle)) –

4

Daha iyi arama gerektiğini ;)

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(); 
} 

böyle bu işlev için dosyanızı geçirin.

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

Tam bayt dizisini bir dizgeye dönüştürmek gerçekten gerekli değil mi? İki karmaşayı karşılaştırmak için biraz fazla çalışıyorum. –

+2

Açıkça 'Close()' çağırmak yerine, akışta 'using' kullanmalısınız. – svick