64

I tried to generate the MD5 sum (using md5sum) of a string, "hello". I tried out different methods as the md5sum tool in Linux, PHP's MD5() function as well as various online text to md5sum translators.

echo "hello" | md5sum

and

echo "hello" > file && md5sum file

Gave the result b1946ac92492d2347c6235b4d2611184. However, PHP's md5() function and almost all online generators gave the output 5D41402ABC4B2A76B9719D911017C592.

What is the reason?

Peter Mortensen
  • 12,090
  • 23
  • 70
  • 90
Himanshu Shekhar
  • 820
  • 1
  • 7
  • 11

2 Answers2

100

@Cyrus's answer is exactly on point with how to resolve this - to explain, when using echo it will output a newline at the end of the string. As you can see on this online output, hello with a newline outputs exactly the MD5 you were getting previously. Using -n suppresses the newline, and will then give you the result you expected.

enter image description here

Edit:

You can see it clearly if you output it to hexdump, which shows the hexadecimal of the bytes there.

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|

See the 0a (\n) in the end of the string

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|

With -n echo doesn't put a new line (\n) in the end

Now with a empty string

$ echo  "" | hd
00000000  0a                                                |.|

Just the New Line character

$ echo -n  "" | hd

Empty string, so hexdump shows no output

Jakuje
  • 10,032
  • 5
  • 33
  • 34
Jonno
  • 21,049
  • 4
  • 61
  • 70
  • 2
    Would be more interesting to pipe `echo hello` and `echo -n hello` to `hexdump -C` respectively ;) – Tom Yan Feb 21 '16 at 21:00
  • 19
    I recommend against `echo -n`, since it's nonstandard and inconsistently supported (see [the Single Unix Spec for `echo`](http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html) and a [more detailed catalog of incompatibilities by Sven Mascheck](http://www.in-ulm.de/~mascheck/various/echo+printf/)). In you want it to work consistently, use `printf` instead; it's a bit more complex to use (you have to specify a format string in addition to the data you want printed), but IMO worth it to avoid trouble. In this case, `printf "%s" "hello"` will do the trick. – Gordon Davisson Feb 22 '16 at 06:33
86

By default, echo includes a newline character at the end of the output. However, PHP and the online sites you used do not include the newline. To suppress the newline character, use the -n flag:

echo -n "hello" | md5sum

Output:

5d41402abc4b2a76b9719d911017c592  -

See: help echo


or with printf:

printf "%s" "hello" | md5sum
Cyrus
  • 5,441
  • 1
  • 22
  • 30