lht80s 2022-07-08 09:53 采纳率: 50%
浏览 87

同一张图片计算的md5值不同

项目中通过md5来比对两张图片是否相同,结果发现部分上传到服务端的图片与手机客户端同一张图片的md5不同,于是将服务端图片重新下载到手机中进行对比测试,结果却很奇怪。
说明:DCIM中的是手机拍照的原图,从头到尾都没有动过;Pictrue中的是从服务端下载回来的图。服务端也是安卓系统。

手机端初测,两个图片md5相同,但值却与服务端不同:

img

手机端再测,将Pictrue中的图片删掉,重新下载,结果两个md5都发生了变化,这次与服务端是相同的。这个值是正确的。

img

奇怪的是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();
    }
  • 写回答

1条回答 默认 最新

  • 於黾 2022-07-08 10:11
    关注

    缓存了吧

    评论

报告相同问题?

问题事件

  • 创建了问题 7月8日

悬赏问题

  • ¥15 Linux环境下CA证书更新问题
  • ¥15 sqlserver语句提取结果以外数据
  • ¥60 微信小程序如何上传QQ聊天文件
  • ¥300 开发的系统遭到无良商家的破解,请问如何防止再次发生,并追回损失
  • ¥15 java代码写在记事本上后在cmd上运行时无报错但又没生成文件
  • ¥15 关于#python#的问题:在跑ldsc数据整理的时候一直抱这种错误,要么--out识别不了参数,要么--merge-alleles识别不了参数(操作系统-linux)
  • ¥15 PPOCRLabel
  • ¥15 混合键合键合机对准标识
  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 安卓OpenCV人脸识别分类器加载