当我在java中使用DigestUtils.md5Hex时,得到了错误的结果

我需要一种方法来计算一些文件的MD5,以确保Android的完整性。 所以我使用org.apache.commons.codec.digest.DigestUtils.md5Hex方法来计算文件的md5,但是我得到的结果与我在linux系统中使用的md5sum不同。 md5sum的结果不会错,所以我不知道我的代码有什么问题。

代码如下(我使用kotlin,但它与Java相同)):

 val fd: AssetFileDescriptor = am.openFd("index.mp3") var result: String = "" val fis: FileInputStream = afd.createInputStream() val bf: ByteArray = fis.readBytes() val t: String = "md5sum" result = org.apaches.commons.codec.digest.DigestUtils.md5Hex(fis) 

我同时使用fis和bf作为md5Hex()的参数,它们有不同的结果,但不是正确的结果。 但是当我使用像“md5sum”这样的字符串时,我得到了和Linux中其他地方一样的结果。 怎么了?

我有一个UtilsEncrypt类获得与不同算法的散列,但我使用java.security而不是commons.codec.digest所以我的进口是:

 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; 

这是我的代码

  public class UtilsEncrypt { /** * @param digest encrypted message * * @return String result in Hexadecimal format */ private static String toHexadecimal(byte[] digest) { String hash = ""; for (byte aux : digest) { int b = aux & 0xff; if (Integer.toHexString(b).length() == 1) hash += "0"; hash += Integer.toHexString(b); } return hash; } /*** * Encrypt a message through an algorithm * * @param message * text to encrypt * @param algorithm * MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512 * @return encrypted message */ public static String getStringMessageDigest(String message, String algorithm) { byte[] digest = null; byte[] buffer = message.getBytes(); try { MessageDigest messageDigest = MessageDigest.getInstance(algorithm); messageDigest.reset(); messageDigest.update(buffer); digest = messageDigest.digest(); } catch (NoSuchAlgorithmException ex) { // Do something } return toHexadecimal(digest); } } 

正如你所看到的,我只使用java.security给我的功能。 您可以将许多不同的算法传递给getStringMessageDigest。 我有一个枚举与我使用的类型。 也许你可以使用其他算法,但我没有与其他人一起测试过。 注意重新设置diggest,以确保你没有错误的内容,你将要使用一个“空的”diggest。