MD5哈希值与Bash和PHP不同

MD5哈希值与Bash和PHP不同

我尝试生成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|

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

现在有一个空字符串

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

只是新线角色

$ echo -n  "" | hd

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

相关内容