Perl giving unexpected md5 hash values

I am trying to speed up creating a line by line hash file from a huge file using Perl.

Here is my current (working but too slow) Bash code:

(while read line; do hash=$(echo -n $line | md5sum); echo ${hash:0:32}; done)

And here is my Perl code:

perl -MDigest::MD5 -le 'foreach $line ( <STDIN> ) {print  Digest::MD5->md5_hex($line)}'

Problem is the hashes don't match. What am I missing?

$ echo "xyz" | perl -MDigest::MD5 -le 'foreach $line ( <STDIN> ) {print Digest::MD5->md5_hex($line)}'
d81e30bc9592abd836c2a1fe2eda5489

$ echo -n "xyz" | perl -MDigest::MD5 -le 'foreach $line ( <STDIN> ) {print Digest::MD5->md5_hex($line)}'
71602ba5e39db459d95ab7c6666bb9e3

$ echo "xyz" | md5sum
b6273b589df2dfdbd8fe35b1011e3183 *-

$ echo -n "xyz" | md5sum
d16fb36f0911f878998c136191af705e *-  << This is the correct one!

$ echo "xyz" | perl -MDigest::MD5 -le 'foreach $line ( <STDIN> ) {print Digest::MD5->md5_hex(chomp($line))}'
d6b2c2e82380abb5b6b57029546640e0

$ echo -n "xyz" | perl -MDigest::MD5 -le 'foreach $line ( <STDIN> ) {print Digest::MD5->md5_hex(chomp($line))}'
7cc36a6eaa4809e20cc4db85e7ce3df5

All different hashes so what exact string am I hashing in the Perl code?

Mike

Try this:

$ echo -n xyz | perl -e 'use Digest::MD5 "md5_hex"; foreach $line ( <STDIN> ) {print md5_hex($line) . "\n"}'
d16fb36f0911f878998c136191af705e

or

$  echo -n xyz | perl -MDigest::MD5 -le 'foreach $line ( <STDIN> ) {print Digest::MD5::md5_hex($line) }'
d16fb36f0911f878998c136191af705e
1 Like

Thanks. My Perl sucks. I don't even know enough to be dangerous. I'm actually getting pretty good with AWK but there are no hashes in AWK.

Mike

Hi,
the ways that work fine:

$ echo -n "xyz" | md5sum
d16fb36f0911f878998c136191af705e  -
$ echo -n "xyz" | perl -MDigest::MD5 -le '$ctx = Digest::MD5->new;$ctx->add(<>);print $ctx->hexdigest'
d16fb36f0911f878998c136191af705e
$ echo -n "xyz" | perl -MDigest::MD5 -le 'print Digest::MD5::md5_hex(<>)'
d16fb36f0911f878998c136191af705e
$ echo -n "xyz" | perl -MDigest::MD5 -le 'use Digest::MD5 qw(md5_hex); print md5_hex(<>)'
d16fb36f0911f878998c136191af705e

Regards.