This question already has an answer here:

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


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?

marked as duplicate by BlueBerry - Vignesh4303, Steven, fixer1234, nc4pk, mdpc Feb 25 '16 at 22:43

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.


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


5d41402abc4b2a76b9719d911017c592  -

See: help echo

or with printf:

printf "%s" "hello" | md5sum
  • I would suggest showing the more widely compatible form before the one that relies on behavior unspecified by POSIX. – Charles Duffy Feb 22 '16 at 22:36
  • Thank you. I prefer to show the problem first with his own example and the behavior of echo. – Cyrus Feb 22 '16 at 22:53
  • 7
    Unless you know the OP's operating system, you don't know that the modified version of "their own example" will actually work. echo -n could echo -n if their Linux is using a stripped-down Busybox. – Charles Duffy Feb 22 '16 at 22:54
  • I know OP's operating system. – Cyrus Feb 22 '16 at 22:55
  • They specify their kernel, but where do they say more than that? – Charles Duffy Feb 22 '16 at 22:55

@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


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

  • 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 and a more detailed catalog of incompatibilities by Sven Mascheck). 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 6:33

Not the answer you're looking for? Browse other questions tagged or ask your own question.