【问题标题】:Zip File md5 Checksum - Every Time DifferentZip 文件 md5 校验和 - 每次都不同
【发布时间】:2015-02-06 18:32:27
【问题描述】:

我有一个获取 zip 文件的 md5 校验和的 Android 应用程序。我用它来比较文件和服务器上的文件。我的问题是每次我尝试为同一个文件生成 md5 时,校验和都是不同的。我在这里发布我的方法。你能告诉我有什么问题吗?

private static String fileMD5(String filePath) throws NoSuchAlgorithmException, IOException {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(filePath);
            byte[] buffer = new byte[1024];
            MessageDigest digest = MessageDigest.getInstance("MD5");
            int numRead = 0;
            while (numRead != -1) {
                numRead = inputStream.read(buffer);
                if (numRead > 0)
                    digest.update(buffer, 0, numRead);
            }
            byte [] md5Bytes = digest.digest();
            return convertHashToString(md5Bytes);
        } catch (Exception e) {
            return "ERROR";
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (Exception e) { }
            }
        }
    }

    private static String convertHashToString(byte[] md5Bytes) {
        String returnVal = "";
        for (int i = 0; i < md5Bytes.length; i++) {
            returnVal += Integer.toString(( md5Bytes[i] & 0xff ) + 0x100, 16).substring(1);
        }
        return returnVal;
    }

【问题讨论】:

  • 我在您的代码中没有看到任何内容来解释为什么您会得到不同的结果。最可能的解释是您的数据因运行而异。即使您将该方法指向相同的文件名,如果在运行之间以任何方式修改文件内容,您也会得到不同的结果。
  • 您的代码看起来不错...我建议您先检查一下您是否总是从文件中读取相同数量的字节。
  • 好的,谢谢。我会尝试:)
  • 我打印了字节数,每次都一样..

标签: java android md5 message-digest md5-file


【解决方案1】:

我尝试解决同样的问题。我不知道如何解决它,但我知道原因:)。

原因是 zip 文件至少包含有关文件的时间戳信息。这就是改变你 md5sum 的原因。每个 zip 条目都是相同的,但此元数据信息会更改 md5 的结果。

您可能已经在其他地方找到了答案。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 2014-06-21
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多