2013-07-17 1 views
2

Вот рабочий процесс.Почему хеши MD5 для тех же данных отличаются от Linux и Windows?

  1. Клиент загружает файл XML и файл контрольной суммы MD5 на наш FTP.
  2. Сервер Perl копирует файл с FTP-сервера.
  3. Сервер Perl выполняет собственную проверку MD5 в файле XML, а затем сравнивает его со значением в файле MD5.

Два хеша MD5 никогда не совпадают. Но когда я копирую файл XML на свою машину Windows и запускаю тот же скрипт Perl, который работает в Windows, я получаю тот же ответ, что и файл 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

Как файл передается с FTP? двоичный или текстовый режим? последний изменяет окончание строк, и, следовательно, контрольная сумма – amon

+1

Является ли соглашение конца строки (* i.e., '" \ r \ n "' versus '" \ n "') одинаковым с обеих сторон? Помните, что режим ascii на FTP выполняет это преобразование. –

ответ

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"; 
Смежные вопросы