我尝试生成MD5使用 md5sum 对字符串“hello”进行求和。我尝试了不同的方法,如 Linux 中的 md5sum 工具、PHP 的 MD5() 函数以及各种在线文本到 md5sum 转换器。
echo "hello" | md5sum
和
echo "hello" > file && md5sum file
给出了结果b1946ac92492d2347c6235b4d2611184
。但是,PHP 的 md5() 函数和几乎所有在线生成器都给出了输出5D41402ABC4B2A76B9719D911017C592
。
是什么原因?
答案1
默认情况下,echo
输出末尾包含换行符。但是,PHP 和您使用的在线网站不包含换行符。要隐藏换行符,请使用以下标志-n
:
echo -n "hello" | md5sum
输出:
5d41402abc4b2a76b9719d911017c592 -
看:help echo
或者使用 printf:
printf "%s" "hello" | md5sum
答案2
@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|
使用-n
echo 时不会\n
在末尾添加新行 ( )
现在有一个空字符串
$ echo "" | hd
00000000 0a |.|
只是新线角色
$ echo -n "" | hd
空字符串,因此hexdump
不显示输出