2014-04-26 46 views
3

我可以顯示選定的兩個不同文件的兩個不同MD5值,但是SHA-1功能顯示兩個不同文件的完全相同的值。這是爲什麼?爲什麼我的SHA-1函數在C#中爲這兩個文件顯示相同的輸出?

我不是一個偉大的程序員,所以我不知道這段代碼是否特別好,但任何幫助或建議將不勝感激。

{ 

System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); 
System.Security.Cryptography.SHA1 sha1 = System.Security.Cryptography.SHA1.Create(); 

FileStream file1 = new FileStream(lblBrowse1.Text, FileMode.Open); 
FileStream file2 = new FileStream(lblBrowse2.Text, FileMode.Open); 


byte[] hash1 = md5.ComputeHash(file1); 
byte[] hash2 = md5.ComputeHash(file2); 
byte[] hash3 = sha1.ComputeHash(file1); 
byte[] hash4 = sha1.ComputeHash(file2); 

file1.Close(); 
file2.Close(); 


textBox1.Text = BitConverter.ToString(hash1).Replace("-", ""); 
textBox2.Text = BitConverter.ToString(hash2).Replace("-", ""); 
textBox6.Text = BitConverter.ToString(hash3).Replace("-", ""); 
textBox7.Text = BitConverter.ToString(hash4).Replace("-", ""); 



if (textBox1.Text == textBox2.Text) 
    { 
MessageBox.Show("These two files are identical."); 
    } 
else 
    { 
MessageBox.Show("These two files are different."); 
    } 
+0

雖然極不可能,但說匹配的散列等於匹配的數據並不是真的。哈希會發生碰撞,所以如果哈希匹配,您應該採取次要措施來確保匹配的數據。 – spender

回答

6

由於MD5哈希值已經移動流EOF兩個文件1和文件2。在重用它們之前,您需要重新回滾流:

byte[] hash1 = md5.ComputeHash(file1); 
byte[] hash2 = md5.ComputeHash(file2); 

file1.Seek(0, SeekOrigin.Begin); 
file2.Seek(0, SeekOrigin.Begin); 

byte[] hash3 = sha1.ComputeHash(file1); 
byte[] hash4 = sha1.ComputeHash(file2); 
+0

這是這裏的正確答案 – whoisj

+0

它的工作。非常感謝你。 – user3576039

5

最有可能的,你所看到的SHA-1散列是,空字符串的:

da39a3ee5e6b4b0d3255bfef95601890afd80709 

這是因爲FileStream已經閱讀一路到底,在之前的MD5散列計算中。

要重新使用FileStream S,你應該「倒帶」他們,就像這樣:

file1.Position = 0; 
+0

這也有效。非常感謝你。 – user3576039

相關問題