项目中通过md5来比对两张图片是否相同,结果发现部分上传到服务端的图片与手机客户端同一张图片的md5不同,于是将服务端图片重新下载到手机中进行对比测试,结果却很奇怪。
说明:DCIM中的是手机拍照的原图,从头到尾都没有动过;Pictrue中的是从服务端下载回来的图。服务端也是安卓系统。
手机端初测,两个图片md5相同,但值却与服务端不同:
手机端再测,将Pictrue中的图片删掉,重新下载,结果两个md5都发生了变化,这次与服务端是相同的。这个值是正确的。
奇怪的是DCIM中的图片一直没动,但两次计算md5却完全不同,而且不管计算多少次,都只有这两个值,并不会出现其他值。
请大家帮忙看看这是为什么。
计算md5的代码
public static String getFileMD5(File file) {
if (null == file || !file.exists() || !file.isFile()) {
return null;
}
String md5Str = "";
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
FileInputStream in = new FileInputStream(file);
byte[] buffer = new byte[1024 * 100];
int size = -1;
while ((size = in.read(buffer)) != -1) {
digest.update(buffer, 0, size);
}
byte[] md5 = digest.digest();
md5Str = bytes2String(md5);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return md5Str;
}
public static String bytes2String(byte[] bytes) {
StringBuilder hexValue = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
int val = ((int) bytes[i]) & 0xff;
// 小于16的情况下,需要补0
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString().toUpperCase();
}