我在使用java中的md5散列時遇到問題。要檢查文件更新,我從我的服務器獲取一個列表,並將這些文件與本地列表進行比較。Java文件MD5和PHP md5_file不同
在php中使用md5_file()
函數創建服務器文件哈希。 我的java代碼來計算文件的校驗和給了我一個不同的輸出比例。
一些調試輸出看出區別:
00000.res:b3359dec77910db596b095be7aa49000
00001.res:84411f08999df4fb6ddab1345d21c72c
00002.res:be305453dd435f4a019a1c7b444aff8b
00003.res:66df5d3462287ba6df7bdaa5c32484f2
00004.res:283d977b128e0e7b07de8d4b867f24c9
00000.res:1f012efee3c2c414512a5f19e5f598dd < server
00001.res:fdb212a9280815d98a67be7fe23408d7 < server
00002.res:64151232cc0e6939a024966e8159151c < server
00003.res:f1c9859d2d1f431b76425b11a6a1090e < server
00004.res:0393da6442a0ec153ded0bb6e7e1085c < server
Java函數:
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
public static String getMD5(File file) throws NoSuchAlgorithmException, IOException {
MessageDigest md = MessageDigest.getInstance("MD5");
InputStream is = new FileInputStream(file);
try {
is = new DigestInputStream(is, md);
byte[] buffer = new byte[4 * 1024];
int read;
while ((read = is.read(buffer)) != -1) {
md.update(buffer, 0, read);
}
} finally {
is.close();
}
final byte[] data = md.digest();
final int l = data.length;
final char[] out = new char[l << 1];
for (int i = 0, j = 0; i < l; i++) {
out[j++] = HEX_DIGITS[(0xF0 & data[i]) >>> 4];
out[j++] = HEX_DIGITS[0x0F & data[i]];
}
return new String(out);
}
我試圖與谷歌搜索,但所有我得到的字符串的MD5哈希值。我很確定我的問題必須通過md.update()函數來完成。我是否以錯誤的方式複製緩衝區?
@jchapa它不是一個重複 - 在這個代碼OP有一個特定的錯誤。 – Alnitak 2013-04-30 14:57:25