2013-02-04 110 views
1

我想要得到的校驗脫穎而出的二進制文件 運行PHP的Perl和PHP MD5文件校驗和不匹配

$checksum =md5_file($fname) 

和perl的

use Digest::MD5; 
open FILE, "$fname"; 
$ctx = Digest::MD5->new; 
$ctx->addfile(*FILE); 
$checksum = $ctx->hexdigest; 

我得到不同的結果 足夠有趣的運行在一個小文本文件上返回相同的校驗和

+1

有你證實,這兩個輸入是相同的,一旦他們進入相應語言的內臟,例如在輸入到md5內核之前沒有行結束的翻譯? –

回答

3

用Perl,你確定文件句柄是在binmodethe documentation建議?

在大多數情況下,您希望在將其作爲參數傳遞給addfile()方法之前確保$ io_handle在binmode中。

我修改從文檔的例子來匹配您的例子:

use Digest::MD5; 
open (my $fh, '<', $fname) or die "Can't open '$fname': $!"; 
binmode ($fh); 
my $checksum = Digest::MD5->new->addfile($fh)->hexdigest; 
+0

做了詭計,謝謝 –

2

你應該打開該文件後,使用binmode(FILE)。如果你仍然有這種變化的差異,再看看你的PHP代碼,因爲更新的Perl代碼產生正確的輸出:

$ perl dm.pl .bashrc 
f5bb0773a3346814d978f9a155176d8e 

$ md5sum .bashrc 
f5bb0773a3346814d978f9a155176d8e *.bashrc