60

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

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?

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.

79

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
  • 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
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

  • 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.