MD5哈希值不同于Bash和PHP [重复]


60

这个问题已经在这里有了答案:

我尝试生成字符串“ hello” 的MD5总和(使用md5sum)。我尝试了各种方法,例如Linux中的md5sum工具,PHP的MD5()函数以及各种在线文本,以供md5sum转换器使用。

echo "hello" | md5sum

echo "hello" > file && md5sum file

得出结果b1946ac92492d2347c6235b4d2611184。但是,PHP的md5()函数和几乎所有在线生成器都提供了输出5D41402ABC4B2A76B9719D911017C592

是什么原因?


38
echo -n“ hello”
马丁·约克

Answers:


80

默认情况下,echo在输出末尾包含换行符。但是,PHP和您使用的在线站点不包括换行符。要取消换行符,请使用-n标志:

echo -n "hello" | md5sum

输出:

5d41402abc4b2a76b9719d911017c592-

看到: help echo


或与printf:

printf "%s" "hello" | md5sum

我建议依靠POSIX未指定的行为之前,显示一种更广泛兼容的形式。
查尔斯·达菲

谢谢。我更喜欢先以他自己的示例和echo的行为来说明问题。
赛勒斯

7
除非您了解OP的操作系统,否则您将不知道修改后的“他们自己的示例”版本是否会真正起作用。如果他们的Linux使用精简的Busybox,则echo -n可能会回显-n
查尔斯·达菲,2016年

我知道OP的操作系统。
赛勒斯(Cyrus)

他们指定了自己的内核,但是在哪里能说更多呢?
查尔斯·达菲

100

@Cyrus的答案正是解决该问题的方法-解释一下,使用echo它时,它将在字符串末尾输出换行符。如您在此在线输出中所看到的,hello带有换行符的输出与您之前获得的MD5完全相同。使用将-n取消换行符,然后将为您提供预期的结果。

在此处输入图片说明

编辑

如果将其输出到hexdump,则可以清楚地看到它,它显示在那里的字节的十六进制。

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|

参见字符串末尾的0a\n

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|

使用-necho不会\n在末尾添加新行()

现在有一个空字符串

$ echo  "" | hd
00000000  0a                                                |.|

只是换行符

$ echo -n  "" | hd

空字符串,因此不hexdump显示任何输出


2
会更有趣管道echo helloecho -n hellohexdump -C分别;)
汤燕

19
我建议不要使用echo -n,因为它是非标准的并且受不一致的支持(请参阅Single Unix Spec,echo以及Sven Mascheck给出的不兼容更详细目录)。如果您希望它始终如一地工作,请printf改用;使用起来有点复杂(除了要打印的数据外,还必须指定格式字符串),但是IMO值得避免麻烦。在这种情况下,printf "%s" "hello"就可以解决问题。
Gordon Davisson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.