2013-03-29 39 views
4

我在檢查C#和PHP文件的MD5校驗和時遇到了一個小問題。由PHP腳本計算的散列值不同於C#計算的散列值。C#和PHP中不同的MD5文件哈希

libcurl.dll C# = c3506360ce8f42f10dc844e3ff6ed999 
libcurl.dll PHP = f02b47e41e9fa77909031bdef07532af 

在PHP我用md5_file功能,我的C#代碼:

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

任何想法如何計算相同的哈希?我認爲這可能與編碼有關。

在此先感謝!

+2

我敢打賭,當您的PHP腳本使用'UTF-8'或'ISO-8859-1'編碼時,C#使用'Windows-1250'編碼...嘗試使編碼在兩側都相同... – shadyyx

+0

它與命令行工具「md5sum」相比如何? –

+0

與FileStream,你不能sute,指針是在begening。使用file.Seek(0,SeekOrigin.Begin)來確保是正確的。所有的例子在msdn中使用它在FileStream的構造函數之後。 – Xaruth

回答

0

我用這個:

我還沒有還沒有任何問題與C#MD5 PHP MD5的比較

System.Text.UTF8Encoding text = new System.Text.UTF8Encoding(); 
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();     
Convert2.ToBase16(md5.ComputeHash(text.GetBytes(encPassString + sess))); 


class Convert2 
{ 
    public static string ToBase16(byte[] input) 
    { 
     return string.Concat((from x in input select x.ToString("x2")).ToArray()); 
    } 
} 
+0

是關於文件md5的嗎?或者只是文字? – Kacper

+0

沒有必要將文件解碼爲文本以獲得MD5。如果它不是UTF-8呢? – Esailija

1

我的C#是生鏽,但會:

byte[] retVal = md5.ComputeHash(file); 

實際閱讀在整個文件中?我認爲這只是散列流對象。我相信你需要讀取流,然後散列整個文件內容?

int length = (int)file.Length; // get file length 
    buffer = new byte[length];  // create buffer 
    int count;      // actual number of bytes read 
    int sum = 0;     // total number of bytes read 

    // read until Read method returns 0 (end of the stream has been reached) 
    while ((count = file.Read(buffer, sum, length - sum)) > 0) 
     sum += count; // sum is a buffer offset for next reading 
    byte[] retVal = md5.ComputeHash(buffer); 

我不知道,如果實際運行原樣,但我認爲將需要類似的規定。

+0

它給出了與使用ComputeHash相同的結果。 – Kacper