The MD5 hash value is different from Bash and PHP
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.
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
Related videos on Youtube
Comments
-
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 output5D41402ABC4B2A76B9719D911017C592
.What is the reason?
-
Martin York about 8 yearsecho -n "hello"
-
Miles about 8 years
-
-
Tom Yan about 8 yearsWould be more interesting to pipe
echo hello
andecho -n hello
tohexdump -C
respectively ;) -
Gordon Davisson about 8 yearsI recommend against
echo -n
, since it's nonstandard and inconsistently supported (see the Single Unix Spec forecho
and a more detailed catalog of incompatibilities by Sven Mascheck). In you want it to work consistently, useprintf
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 about 8 yearsI would suggest showing the more widely compatible form before the one that relies on behavior unspecified by POSIX.
-
Cyrus about 8 yearsThank you. I prefer to show the problem first with his own example and the behavior of echo.
-
Charles Duffy about 8 yearsUnless 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 about 8 yearsI know OP's operating system.
-
Charles Duffy about 8 yearsThey specify their kernel, but where do they say more than that?
-
Cyrus about 8 years@CharlesDuffy: Good catch.
-
lrkwz about 7 yearswhat about the extra ``` -``` at the end?
-
Cyrus about 7 years@lrkwz: I assume that means the data came from stdin and not from a file.