【问题标题】:Why doesn't md5 match Perl's Digest::MD5 output?为什么 md5 不匹配 Perl 的 Digest::MD5 输出?
【发布时间】:2011-01-17 05:27:56
【问题描述】:

从 ksh 终端运行 md5 函数与简单 Perl 脚本的输出不匹配。

在我运行的终端中:

echo -n abc | md5
62fecf21103616856d72e6ffc9bcb06b

如果我使用 Perl 运行它:

use Digest::MD5 qw(md5_hex);

foreach (@ARGV) {
   print "Digest is ", md5_hex($_), "\n";
}
exit

我明白了

./perl_test.sh abc
Digest is 900150983cd24fb0d6963f7d28e17f72

在我看到的所有示例和md5 函数本身的示例中,Perl 看起来正确,但仅使用 Ksh 的示例却不正确:

md5 -x
MD5 test suite:
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

【问题讨论】:

  • echo 输出 'c' 和管道之间的空间吗?
  • md5 不是 ksh 函数。顺便说一句,这也会给出与您的 Perl 版本相匹配的结果:echo -e 'abc\c' | md5。 @Anon.:不,试试echo abc |hd(或hexdump -C)。

标签: perl md5 ksh


【解决方案1】:

使用更便携的printf

printf "abc" | md5

【讨论】:

  • 非常感谢。不知道为什么我之前没有在这里发布问题。
  • 在看到这些回复并感谢@ghostdog74 和 Dennis Wiliamson 之后,我最终选择了 echo "abc/c" | md5 我估计我读了 15 次手册页,但从未注意到 /c 的内容。
【解决方案2】:

您的 echo 无法识别 -n 选项,因此您正在对字符串 '-n abc\n' 进行哈希处理。

【讨论】:

  • 我只尝试了 echo abc | md5 但仍然得到不正确的哈希值。如何删除换行符,或者您知道使用 ksh 快速创建 md5 哈希的另一种方法吗? 0bee89b07a248e27c83fc3d5951213c1
  • @Anthony:试试/bin/echo -n abc | md5 或者 /usr/bin/echo
【解决方案3】:

进一步GregS的回答,一些例子:

$ md5 -s "-n abc"$'\012' # \012 = newline
MD5 ("-n abc
") = 62fecf21103616856d72e6ffc9bcb06b

$ md5 -s "abc"
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72

【讨论】:

    【解决方案4】:

    当我遇到这些问题时,我通常会做这样的事情来检查我的输出是什么(例如显示制表符、空格等)

    $ echo abc | hexdump -c
    0000000   a   b   c  \n                                                
    0000004
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多