【问题标题】:hexdigest generating different values in linux and windows for same filehexdigest 在 linux 和 windows 中为同一个文件生成不同的值
【发布时间】:2014-04-01 07:12:11
【问题描述】:


我正在使用 Digest::MD5 模块,并在该 hexdigest 中为 windows 和 linux 返回不同的值。

请帮我解决问题。

use Digest::MD5;
my $ctx=Digest::MD5->new();
open RD, "input.txt";
$ctx->addfile(*RD);
close RD;
print $ctx->hexdigest;

input.txt 文件有以下内容:

hello

输出:窗口

5d41402abc4b2a76b9719d911017c592

输出:Linux

af5597c29467a96523a70787c319f4db

谢谢,
沙拉湾

【问题讨论】:

  • 你怎么知道这两个input.txt是一样的?
  • @leeduhem 他可以 md5 验证!
  • @RobEarl 是的,他可以。但他不相信md5的结果。

标签: perl perl-module perl-data-structures digest md5sum


【解决方案1】:

根据提问者给出的cmets,input.txt是在windows中生成的,然后复制到linux中,那么我认为问题是windows和linux的行尾不同造成的,在windows端-of-line 是 '\r\n',在 Linux 中是 '\n'。因此,使用 binmode() 将文件处理程序设置为二进制模式应该能够解决此问题,如 Digest::MD5 示例中所建议的那样。

这应该可以解决问题:

#!/usr/bin/perl

use warnings;
use strict;

use Digest::MD5;

open my $fh, '<', 'input.txt' or die "Cannot open input.txt: $!";
binmode $fh, ':raw'; # <==== NOTE this binmode()

my $md5 = Digest::MD5->new;
$md5->addfile($fh);
print $md5->hexdigest, "\n";
close $fh;

【讨论】:

  • 谢谢我在windows中添加binmode后尝试了它的工作我在windows中添加了binmode,在linux中我删除了binmode现在我得到了相同的值。
  • @Saravanan Windows 版本脚本中不需要删除binmode()
  • 您可能更喜欢binmode $file, ':raw' 来明确访问模式。在任何情况下,$file 都是一个糟糕的名字。它可能是一个文件名字符串、一个文件路径字符串,或者像这里一样不寻常的是一个文件句柄。我建议至少$fn$path$fh
  • @Borodin 你说得对,$file 是文件处理程序引用的错误选择。答案已更新。
【解决方案2】:

那可能是因为每次hash值发生变化,可以参考这个http://en.wikipedia.org/wiki/MD5

【讨论】:

    猜你喜欢
    • 2016-02-19
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多