2013-03-29 41 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