The MD5 hash value is different from Bash and PHP

41,286

Solution 1

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

Solution 2

@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:
41,286

Related videos on Youtube

Himanshu Shekhar
Author by

Himanshu Shekhar

https://linkedin.com/in/himanshub16

Updated on September 18, 2022

Comments

  • Himanshu Shekhar
    Himanshu Shekhar over 1 year

    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?

  • Tom Yan
    Tom Yan about 8 years
    Would be more interesting to pipe echo hello and echo -n hello to hexdump -C respectively ;)
  • Gordon Davisson
    Gordon Davisson about 8 years
    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.
  • Charles Duffy
    Charles Duffy about 8 years
    I would suggest showing the more widely compatible form before the one that relies on behavior unspecified by POSIX.
  • Cyrus
    Cyrus about 8 years
    Thank you. I prefer to show the problem first with his own example and the behavior of echo.
  • Charles Duffy
    Charles Duffy about 8 years
    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.
  • Cyrus
    Cyrus about 8 years
    I know OP's operating system.
  • Charles Duffy
    Charles Duffy about 8 years
    They specify their kernel, but where do they say more than that?
  • Cyrus
    Cyrus about 8 years
    @CharlesDuffy: Good catch.
  • lrkwz
    lrkwz about 7 years
    what about the extra ``` -``` at the end?
  • Cyrus
    Cyrus about 7 years
    @lrkwz: I assume that means the data came from stdin and not from a file.