为什么使用PHP';md5不同于OpenSSL';md5是什么?

为什么使用PHP';md5不同于OpenSSL';md5是什么?,php,openssl,md5,Php,Openssl,Md5,我很困惑,为什么在PHP和OpenSSL中看到md5哈希的不同结果 以下是我正在运行的代码: php -r "echo md5('abc');" 结果显示:900150983cd24fb0d6963f7d28e17f72 而这: echo abc | openssl md5 结果:0bee89b07a248e27c83fc3d5951213c1 为什么?计算MD5的方法只有一种 盲目的猜测是,第二个字符串在被散列的字符串中还包含一个换行符 是的,核实过了。就是这样。echo通常在输出的字符串

我很困惑,为什么在PHP和OpenSSL中看到md5哈希的不同结果

以下是我正在运行的代码:

php -r "echo md5('abc');"
结果显示:900150983cd24fb0d6963f7d28e17f72

而这:

echo abc | openssl md5
结果:0bee89b07a248e27c83fc3d5951213c1


为什么?

计算MD5的方法只有一种

盲目的猜测是,第二个字符串在被散列的字符串中还包含一个换行符


是的,核实过了。就是这样。

echo
通常在输出的字符串末尾添加一个新行字符;这就是MD5值不同的原因


正如jdehaan所说,尝试使用echo-nabc | openssl md5

,如果您告诉echo不要输出换行符,您就会得到预期的答案

echo -n "abc" | openssl md5
900150983cd24fb0d6963f7d28e17f72

正如大家所指出的,问题是echo打印了一个额外的换行符

然而,提出的解决方案(
echo-n
)并不完全正确。根据POSIX标准,“如果不使用它,世界会变得更好。 使用

或者干脆

printf abc | openssl md5

这很奇怪,但是
echo
返回一个换行符。使用
echo-n abc | openssl md5
获得与PHP版本相同的输出。POSIX标准还规定,如果第一个操作数是
-n
,或者如果任何操作数包含反斜杠(
'\'
)字符,则结果由实现定义。(在同一页的下一页)-XSI扩展说明-n必须作为普通字符串处理(如果系统符合XSI,那么您可以使用
echo“abc\c”
)FWIW,您犯了这个错误,这是一个好朋友。关于堆栈溢出,这个问题已经被问了好几次,例如:--这让我感觉好一点:)thnx:)
printf abc | openssl md5