为什么两次common-codec md5的结果不同

时间:2015-07-03 07:45:57

标签: java inputstream md5

当我使用apache common-codec md5Hex获取输入流的md5结果时,但得到两次不同的结果。示例代码如下:

public static void main(String[] args) {
    String data = "D:\\test.jpg";
    File file = new File(data);
    InputStream is = null;
    try {
        is = new FileInputStream(file);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    String digest = null, digest2 = null;
    try {
        System.out.println(is.hashCode());
        digest = DigestUtils.md5Hex(is);
        System.out.println(is.hashCode());

        digest2 = DigestUtils.md5Hex(is);
        System.out.println(is.hashCode());

    } catch (IOException e) {
        e.printStackTrace();
    }
    System.out.println("Digest = " + digest);
    System.out.println("Digest2 = " + digest2);
}

结果是:

1888654590
1888654590
1888654590
Digest = 5cc6c20f0b3aa9b44fe952da20cc928e
Digest2 = d41d8cd98f00b204e9800998ecf8427e

谢谢你的回答!

3 个答案:

答案 0 :(得分:3)

InputStream只能遍历一次。第一个调用遍历它并返回输入文件的MD5。当您第二次致电md5hex时,InputStream指向文件结尾,因此digest2empty input的MD5。

答案 1 :(得分:3)

d41d8cd98f00b204e9800998ecf8427e是空字符串("")的md5哈希值。

这是因为is是一个流,这意味着一旦你读了它(在DigestUtils.md5Hex(is)中),“光标”就在流的末尾,那里没有更多的数据读取,因此尝试读取任何内容将返回0个字节。

我建议将流的内容改为byte[],然后对其进行散列 有关如何从byte[]获取InputStream,请参阅this question

答案 2 :(得分:0)

您无法在InputStream中向后移动。所以调用两次:

DigestUtils.md5Hex(is);

不一样。更好地读入字节数组并使用:

public static String md5Hex(byte[] data)