java - 从 URL 获取文件的 MD5 哈希值

标签 java android md5

我得到的结果是相同类型的文件返回相同的 md5 哈希值。例如,两个不同的 jpg 给我相同的结果。但是,jpg 与 apk 给出不同的结果。

这是我的代码...

public static String checkHashURL(String input) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        InputStream is = new URL(input).openStream();

        try {
            is = new DigestInputStream(is, md);

            int b;

            while ((b = is.read()) > 0) {
                ;
            }
        } finally {
            is.close();
        }
        byte[] digest = md.digest();
        StringBuffer sb = new StringBuffer();

        for (int i = 0; i < digest.length; i++) {
            sb.append(
                    Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(
                            1));
        }
        return sb.toString();

    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }
}

最佳答案

这是坏了:

while ((b = is.read()) > 0)

您的代码将在流的第一个字节 0 处停止。如果两个文件在第一个 0 字节之前具有相同的值,您将失败。如果您真的想要调用read 的逐字节版本,您需要:

while (is.read() != -1) {}

parameterless InputStream.read()方法在到达流的末尾时返回 -1。

(不需要为 b 赋值,因为您没有使用它。)

最好一次读取一个缓冲区:

byte[] ignoredBuffer = new byte[8 * 1024]; // Up to 8K per read
while (is.read(ignoredBuffer) > 0) {}

这次条件有效,因为InputStream.read(byte[])如果你传入一个空缓冲区,它只会返回 0。否则,它将尝试读取至少一个字节,返回读取数据的长度,如果已到达流的末尾,则返回 -1。

关于java - 从 URL 获取文件的 MD5 哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13384478/

相关文章:

java - 更好的替代方法是使用 Void 作为可选参数

android - RecyclerView 中只显示一项

java - Android 中频繁更改 View 的最佳方法?

php - 一个字符串的 md5 散列可以在一个地方与另一个地方不同吗?

cryptography - 如何从 Golang 中的字符串中获取 MD5 哈希?

java - 如何验证MD5

java - Jersey 过滤器在 Tomcat 上抛出异常

java - SortedMap 与 CheckedSortedMap 与 synchronizedSortedMap

Java从main方法之外的方法引用ArrayList

android - 如何在Android中运行Conv3D模型?