Only the “short” solution I wrote involved buffering to memory. The “long” 
solution I wrote involves no buffering. The DigestInputStream is not related to 
whether or not there is buffering, all it does is it lets you read the stream 
and get a digest at the same time. If you are just throwing out the data, 
there’s no need for the DigestInputStream. DigestInputStream just takes the 
result of every read call and sends the bytes to MessageDigest#update before 
returning the data. DigestInputStream makes sense if you were, for example, 
passing that input stream to another method that wrote the content to a file 
then you wanted to get the digest after the file write was complete.

Jason

From: Gerald Wiltse [mailto:[email protected]]
Sent: Friday, March 04, 2016 10:08 AM
To: [email protected]
Subject: Re: Groovy Hash Calculations

I'm trying to verify the sha1 hash on a file download without saving it to 
disk, and without buffering the whole thing.  I think this solution might 
buffer all the data into "content" before going into the eachByte loop. I 
thought that was the reason for the DigestInputStream.  Do you know if this is 
correct?

Gerald R. Wiltse
[email protected]<mailto:[email protected]>


On Fri, Mar 4, 2016 at 9:40 AM, Winnebeck, Jason 
<[email protected]<mailto:[email protected]>> wrote:
Here is how I would do it. I provide both a “short” solution and a “long” one. 
I would use the “short” solution if I was making for example a developer only 
tool and I knew I was only hashing small things for example a configuration 
file in a build script and want a one-liner. Otherwise I’d use the “long” 
version.

//If the content is guaranteed to be short:
def content = new ByteArrayInputStream("Here be dragons".bytes)
println MessageDigest.getInstance("SHA1").digest(content.bytes).encodeHex()

//If the content might be arbitrarily long:
content = new ByteArrayInputStream("Here be dragons".bytes)
def digest = MessageDigest.getInstance("SHA1")
content.eachByte(4096) { bytes, len ->
  digest.update(bytes, 0, len)
}
println digest.digest().encodeHex()

Jason

From: Gerald Wiltse [mailto:[email protected]<mailto:[email protected]>]
Sent: Friday, March 04, 2016 9:18 AM
To: [email protected]<mailto:[email protected]>
Subject: Groovy Hash Calculations

Hello All,

I have this block, it's pretty compressed, just wondering if there is a more 
groovy way to handle reading the buffer and computing the hash.

        def messageDigest = MessageDigest.getInstance("SHA1")
        def dis = new DigestInputStream(content, messageDigest)
        byte[] buffer = new byte[1024];
        while (dis.read(buffer) != -1) {}
        def sha1Hex = new BigInteger(1, 
messageDigest.digest()).toString(16).padLeft(40, '0')


Gerald R. Wiltse
[email protected]<mailto:[email protected]>

________________________________
This email message and any attachments are for the sole use of the intended 
recipient(s). Any unauthorized review, use, disclosure or distribution is 
prohibited. If you are not the intended recipient, please contact the sender by 
reply email and destroy all copies of the original message and any attachments.

Reply via email to