Search code examples
javamd5sha1checksumgnupg

Calculate multiple checksums from the same InputStream using DigestInputStream


I am trying to figure out how to read multiple digests (md5, sha1, gpg) based on the same InputStream using DigestInputStream. From what I've checked in the documentation, it seems to be possible by cloning the digest. Could somebody please illustrate this?

I don't want to be re-reading the stream in order to calculate the checksums.


Solution

  • You could wrap a DigestInputStream around a DigestInputStream and so on recursively:

    DigestInputStream shaStream = new DigestInputStream(
        inStream, MessageDigest.getInstance("SHA-1"));
    DigestInputStream md5Stream = new DigestInputStream(
        shaStream, MessageDigest.getInstance("MD5"));
    // VERY IMPORTANT: read from final stream since it's FilterInputStream
    byte[] shaDigest = shaStream.getMessageDigest().digest();
    byte[] md5Digest = md5Stream.getMessageDigest().digest();