code: @Nonnull
    public static MessageDigestValue create (@Nonnull @WillClose final InputStream aIS,
                                             @Nonnull final EMessageDigestAlgorithm eAlgorithm) throws IOException
    {
      final MessageDigest aMD = eAlgorithm.createMessageDigest ();
      StreamHelper.readUntilEOF (aIS, (aBytes, nBytes) -> aMD.update (aBytes, 0, nBytes));
      // aMD goes out of scope anyway, so no need to copy byte[]
      return new MessageDigestValue (eAlgorithm, aMD.digest (), false);
    }
docs: Create a new {@link MessageDigestValue} object based on the passed source
  {@link InputStream}.
  
  @param aIS
  The input stream to read from. May not be <code>null</code>.
  @param eAlgorithm
  The algorithm to be used. May not be <code>null</code>.
  @return Never <code>null</code>.
  @throws IOException
  In case reading throws an IOException