我想比較來自同一文件的MD5哈希。該文件通過來自Android的HTTP POST被髮送爲byte [],在那裏我還計算散列並從.NET服務器接收,在那裏我再次計算散列,然後想要比較它們。Java和C之間的不同MD5#
的問題是,對於同一個文件,我得到不同的散列...
Java代碼
FileInputStream fileInputStream = null;
byte[] bFile = new byte[(int) file.length()];
try {
fileInputStream = new FileInputStream(file);
fileInputStream.read(bFile);
} catch (Exception e) {
e.printStackTrace();
}
try {
MessageDigest md = MessageDigest.getInstance("MD5");
int read = 0;
while((read = fileInputStream.read(bFile)) != -1) {
md.update(bFile, 0, read);
}
fileInputStream.close();
byte[] mdBytes = md.digest();
StringBuffer sb = new StringBuffer();
for(int i=0; i < mdBytes.length; ++i) {
sb.append(Integer.toString((mdBytes[i] & 0xff) + 0x100, 16).substring(1));
}
// generated MD5 is d41d8cd98f00b204e9800998ecf8427e
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
C#代碼
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filePath))
{
string hexString = ToHex(md5.ComputeHash(stream), false);
// Generated MD5 is d167df114a478809ef71fb7e10c40f8c
}
}
public string ToHex(byte[] bytes, bool upperCase)
{
StringBuilder result = new StringBuilder(bytes.Length * 2);
for (int i = 0; i < bytes.Length; i++)
result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));
return result.ToString();
}
UPDATE
我試着將Java代碼更改爲
StringBuffer sb = new StringBuffer();
for(int i=0; i < mdBytes.length; ++i) {
sb.append(String.format("%02x", mdBytes[i]));
}
結果總是一樣的...
我認爲這個問題依賴於對數值進行加密,而不是獲取MD5。 –
也這麼認爲......但無法弄清楚錯誤在哪裏 –
爲什麼你用不同的方式來獲取HEX字符串?我不知道該代碼中發生了什麼:'sb.append(Integer.toString((mdBytes [i]&0xff)+ 0x100,16).substring(1));' –