The Javadoc is pretty clear. You can use clone only to calculate different intermediate digests using the same algorithm. You cannot use DigestInputStream
to calculate different digest algorithms without reading the stream multiple times. You must use a regular InputStream
and multiple MessageDigest
objects; read the data once, passing each buffer to all MessageDigest
objects to get multiple digests with different algorithms.
You could easily encapsulate this in your own variant of DigestInputStream
, say MultipleDigestInputStream
that follows the same general approach but accepts a collection of MessageDigest
objects or algorithm names.
Pseudojava (error handling omitted)
MessageDigest sha = MessageDigest.getInstance("SHA-1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
InputStream input = ...;
byte[] buffer = new byte[BUFFER_SIZE];
int len;
while((len = input.read(buffer)) >= 0)
{
sha.update(buffer,0,len);
md5.update(buffer,0,len);
...
}
byte[] shaDigest = sha.digest();
byte[] md5Digest = md5.digest();