【问题标题】:Java file MD5 and PHP md5_file differJava 文件 MD5 和 PHP md5_file 不同
【发布时间】:2013-04-30 14:48:38
【问题描述】:

我在使用 java 中的 md5 哈希时遇到问题。为了检查文件更新,我从我的服务器获取一个列表并将文件与本地列表进行比较。

使用 php.ini 中的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 在此代码中有一个特定的错误。

标签: java php md5


【解决方案1】:

据我所知,您根本不应该调用 .update - DigestInputStream 的全部意义在于它会在您阅读摘要时即时更新

您只需在最后调用.digest 即可获得最终结果。

【讨论】:

  • 谢谢,解决了。所以DigestInputStream 在运行时更新它的哈希值,很高兴知道!
  • 我在尝试更正此答案时遇到了同样的问题。您能发布更新后的工作代码吗?
猜你喜欢
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 2014-05-28
相关资源
最近更新 更多