为什么MD5哈希在Linux和Windows上针对相同的数据不同?

时间:2013-07-17 22:37:38

标签: perl md5

这是工作流程。

  1. 客户端将XML文件和校验和MD5文件上传到我们的FTP。
  2. Perl服务器从FTP服务器复制文件。
  3. Perl服务器对XML文件运行自己的MD5检查,然后将其与MD5文件中的值进行比较。
  4. 两个MD5哈希值永远不匹配。但是,当我将XML文件复制到我的Windows机器并运行在Windows中运行的相同Perl脚本时,我得到的答案与它们的MD5文件相同。

    谁能告诉我发生了什么?

    这是我用来计算MD5哈希的脚本。

    use warnings;
    use strict;
    use Digest::MD5;
    my $fname = "MarketPricePoint_2013_07_16_1500.xml";
    open (my $fh, '<', $fname) or die "Can't open '$fname': $!";
    binmode ($fh);
    my $hash = Digest::MD5->new->addfile($fh)->hexdigest;
    print $hash;
    

1 个答案:

答案 0 :(得分:2)

ASCII模式是执行行结尾静默转换的FTP服务器的常见默认设置。如果始终无法以二进制模式进行传输,请考虑对行结尾进行标准化,如下所示。

use strict;
use warnings;

use Digest::MD5;

my $fname = "MarketPricePoint_2013_07_16_1500.xml";
open (my $fh, '<', $fname) or die "$0: open $fname: $!";
binmode ($fh) or die "$0: binmode: $!";;

(my $data = do { local $/; <$fh> }) =~ s/\r\n/\n/g;

my $hash = Digest::MD5->new->add($data)->hexdigest;
print $hash, "\n";