Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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?

share|improve this question

marked as duplicate by BlueBerry - Vignesh4303, Steven, fixer1234, nc4pk, mdpc Feb 25 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.

38  
echo -n "hello" – Loki Astari Feb 21 at 21:27
16  
up vote 72 down vote accepted

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
share|improve this answer
    
I would suggest showing the more widely compatible form before the one that relies on behavior unspecified by POSIX. – Charles Duffy Feb 22 at 22:36
    
Thank you. I prefer to show the problem first with his own example and the behavior of echo. – Cyrus Feb 22 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 at 22:54
    
I know OP's operating system. – Cyrus Feb 22 at 22:55
    
They specify their kernel, but where do they say more than that? – Charles Duffy Feb 22 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

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

share|improve this answer
2  
Would be more interesting to pipe echo hello and echo -n hello to hexdump -C respectively ;) – Tom Yan Feb 21 at 21:00
17  
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 at 6:33

protected by Raystafarian Feb 23 at 12:36

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

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