提交 61db8e9f 编写于 作者: J Juergen Hoeller

DigestUtils processes InputStream with buffered read instead of full copy

Issue: SPR-14427
上级 2bf9bc31
...@@ -23,11 +23,13 @@ import java.security.NoSuchAlgorithmException; ...@@ -23,11 +23,13 @@ import java.security.NoSuchAlgorithmException;
/** /**
* Miscellaneous methods for calculating digests. * Miscellaneous methods for calculating digests.
*
* <p>Mainly for internal use within the framework; consider * <p>Mainly for internal use within the framework; consider
* <a href="http://commons.apache.org/codec/">Apache Commons Codec</a> * <a href="http://commons.apache.org/codec/">Apache Commons Codec</a>
* for a more comprehensive suite of digest utilities. * for a more comprehensive suite of digest utilities.
* *
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Juergen Hoeller
* @author Craig Andrews * @author Craig Andrews
* @since 3.0 * @since 3.0
*/ */
...@@ -49,8 +51,8 @@ public abstract class DigestUtils { ...@@ -49,8 +51,8 @@ public abstract class DigestUtils {
} }
/** /**
* Calculate the MD5 digest of the given InputStream. * Calculate the MD5 digest of the given stream.
* @param inputStream the inputStream to calculate the digest over * @param inputStream the InputStream to calculate the digest over
* @return the digest * @return the digest
* @since 4.2 * @since 4.2
*/ */
...@@ -59,8 +61,7 @@ public abstract class DigestUtils { ...@@ -59,8 +61,7 @@ public abstract class DigestUtils {
} }
/** /**
* Return a hexadecimal string representation of the MD5 digest of the given * Return a hexadecimal string representation of the MD5 digest of the given bytes.
* bytes.
* @param bytes the bytes to calculate the digest over * @param bytes the bytes to calculate the digest over
* @return a hexadecimal digest string * @return a hexadecimal digest string
*/ */
...@@ -69,9 +70,8 @@ public abstract class DigestUtils { ...@@ -69,9 +70,8 @@ public abstract class DigestUtils {
} }
/** /**
* Return a hexadecimal string representation of the MD5 digest of the given * Return a hexadecimal string representation of the MD5 digest of the given stream.
* inputStream. * @param inputStream the InputStream to calculate the digest over
* @param inputStream the inputStream to calculate the digest over
* @return a hexadecimal digest string * @return a hexadecimal digest string
* @since 4.2 * @since 4.2
*/ */
...@@ -127,7 +127,12 @@ public abstract class DigestUtils { ...@@ -127,7 +127,12 @@ public abstract class DigestUtils {
return messageDigest.digest(); return messageDigest.digest();
} }
else { else {
return messageDigest.digest(StreamUtils.copyToByteArray(inputStream)); final byte[] buffer = new byte[StreamUtils.BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
messageDigest.update(buffer, 0, bytesRead);
}
return messageDigest.digest();
} }
} }
......
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
package org.springframework.util; package org.springframework.util;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import org.junit.Before; import org.junit.Before;
...@@ -25,6 +27,7 @@ import static org.junit.Assert.*; ...@@ -25,6 +27,7 @@ import static org.junit.Assert.*;
/** /**
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Juergen Hoeller
*/ */
public class DigestUtilsTests { public class DigestUtilsTests {
...@@ -38,24 +41,39 @@ public class DigestUtilsTests { ...@@ -38,24 +41,39 @@ public class DigestUtilsTests {
@Test @Test
public void md5() { public void md5() throws IOException {
byte[] result = DigestUtils.md5Digest(bytes);
byte[] expected = new byte[] byte[] expected = new byte[]
{-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b}; {-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b};
byte[] result = DigestUtils.md5Digest(bytes);
assertArrayEquals("Invalid hash", expected, result);
result = DigestUtils.md5Digest(new ByteArrayInputStream(bytes));
assertArrayEquals("Invalid hash", expected, result); assertArrayEquals("Invalid hash", expected, result);
} }
@Test @Test
public void md5Hex() throws UnsupportedEncodingException { public void md5Hex() throws IOException {
String expected = "b10a8db164e0754105b7a99be72e3fe5";
String hash = DigestUtils.md5DigestAsHex(bytes); String hash = DigestUtils.md5DigestAsHex(bytes);
assertEquals("Invalid hash", "b10a8db164e0754105b7a99be72e3fe5", hash); assertEquals("Invalid hash", expected, hash);
hash = DigestUtils.md5DigestAsHex(new ByteArrayInputStream(bytes));
assertEquals("Invalid hash", expected, hash);
} }
@Test @Test
public void md5StringBuilder() throws UnsupportedEncodingException { public void md5StringBuilder() throws IOException {
String expected = "b10a8db164e0754105b7a99be72e3fe5";
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
DigestUtils.appendMd5DigestAsHex(bytes, builder); DigestUtils.appendMd5DigestAsHex(bytes, builder);
assertEquals("Invalid hash", "b10a8db164e0754105b7a99be72e3fe5", builder.toString()); assertEquals("Invalid hash", expected, builder.toString());
builder = new StringBuilder();
DigestUtils.appendMd5DigestAsHex(new ByteArrayInputStream(bytes), builder);
assertEquals("Invalid hash", expected, builder.toString());
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册