【问题标题】:Why are MD5 hashes for the same data different on Linux and Windows?为什么 Linux 和 Windows 上相同数据的 MD5 哈希值不同?
【发布时间】:2013-07-17 22:37:38
【问题描述】:

这是工作流程。

  1. 客户端将一个 XML 文件和一个校验和 MD5 文件上传到我们的 FTP。
  2. Perl 服务器从 FTP 服务器复制文件。
  3. Perl 服务器对 XML 文件运行自己的 MD5 检查,然后将其与 MD5 文件中的值进行比较。

这两个 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;

【问题讨论】:

  • 文件是如何通过FTP传输的?二进制还是文本模式?后者改变行尾,从而改变校验和
  • 行尾(i.e."\r\n""\n")约定在两边是否相同?请记住,FTP 中的 ascii 模式会执行此转换。

标签: perl md5


【解决方案1】:

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";

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多