请问md5(file_contents_as_string)是否等于md5_file(/ path / to / file)?

时间:2012-05-24 13:53:28

标签: php md5 md5-file

如果我这样做:

<?php echo md5(file_get_contents("/path/to/file")) ?>

...这总是产生与:

相同的哈希值

<?php echo md5_file("/path/to/file") ?>

4 个答案:

答案 0 :(得分:28)

是的他们会返回相同的内容:

var_dump(md5(file_get_contents(__FILE__)));
var_dump(md5_file(__FILE__));

在我的情况下返回这个:

string(32) "4d2aec3ae83694513cb9bde0617deeea"
string(32) "4d2aec3ae83694513cb9bde0617deeea"

编辑: 看看这两个函数的源代码:https://github.com/php/php-src/blob/master/ext/standard/md5.c(第47行和第76行)。它们都使用相同的函数来生成散列,除了md5_file()函数首先打开文件。

第二编辑: 基本上md5_file()函数根据文件内容生成散列,而不是像文件名那样生成文件元数据。这与Linux系统上md5sum的工作方式相同。 见这个例子:

pr@testumgebung:~# echo foobar > foo.txt
pr@testumgebung:~# md5sum foo.txt
14758f1afd44c09b7992073ccf00b43d  foo.txt
pr@testumgebung:~# mv foo.txt bar.txt
pr@testumgebung:~# md5sum bar.txt
14758f1afd44c09b7992073ccf00b43d  bar.txt

答案 1 :(得分:3)

md5_file命令只使用md5散列文件的内容

如果您参考旧的md5_file PHP实现(但原理仍然相同)source

function php_compat_md5_file($filename, $raw_output = false)
{
// ...
// removed protections

 if ($fsize = @filesize($filename)) {
        $data = fread($fh, $fsize);
    } else {
        $data = '';
        while (!feof($fh)) {
            $data .= fread($fh, 8192);
        }
    }

    fclose($fh);

    // Return
    $data = md5($data);
    if ($raw_output === true) {
        $data = pack('H*', $data);
    }

    return $data;
}

因此,如果您使用md5哈希任何字符串或内容,您将始终获得与md5_file相同的结果(对于相同的编码和文件内容)。

在这种情况下,如果您使用file_get_content()或使用md5_file或者使用md5命令并使用与文件相同的内容,则使用md5散列文件的内容内容,你总会得到相同的结果。

例如,您可以更改文件的文件名,对于具有相同内容的两个不同文件,它们将生成相同的md5哈希值。

以身作则: 考虑两个包含名为1.txt和2.txt

的“stackoverflow”(不带引号)的文件
md5_file("1.txt");
md5_file("2.txt");

会输出

73868cb1848a216984dca1b6b0ee37bc

如果您md5("stackoverflow")md5(file_get_contents("1.txt"))md5(file_get_contents("1.txt")).

,您将获得完全相同的结果

答案 2 :(得分:3)

  

基于文件内容,而不是文件元数据,如BOM或文件名

关于BOM的说法不正确。 BOM是文件内容的一部分,您可以在任何非unicode文件编辑器中看到它的三个字节。

答案 3 :(得分:2)

是的,我试了几次。 就我而言,结果为:

<?php echo md5(file_get_contents("1.php")) ?>
<br/>
<?php echo md5_file("1.php") ?>

生成输出:

660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2 

这两行似乎相同。