当我使用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
谢谢你的回答!
答案 0 :(得分:3)
InputStream
只能遍历一次。第一个调用遍历它并返回输入文件的MD5。当您第二次致电md5hex
时,InputStream
指向文件结尾,因此digest2
是empty 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)