web-dev-qa-db-ja.com

md5(file_contents_as_string)はmd5_file(/ path / to / file)と同じですか?

私が行った場合:

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

...これは常に次と同じハッシュを生成しますか?

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

30
Tom

はい、彼らは同じものを返します:

_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()関数が最初にファイルを開きます。

2番目の編集:基本的に、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
_
29
prehfeldt

bOMやファイル名などのファイルメタデータではなく、ファイルの内容に基づいています

それはBOMについては正しくありません。 BOMはファイルコンテンツの一部であり、Unicode以外のファイルエディタでその3バイトを確認できます。

3
Mycelin

_md5_file_コマンドは、ファイルのcontentをmd5でハッシュするだけです。

古いmd5_file PHPの実装を参照する場合(ただし、原則は同じです) ソース

_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_と同じ結果が得られます(同じエンコーディングとファイルコンテンツの場合)。

その場合、md5でファイルの内容をfile_get_content()でハッシュするか、_md5_file_を使用するか、ファイルの内容と同じ内容で_md5_コマンドを使用する場合でも、常に同じ結果が得られます。

たとえば、ファイルのファイル名を変更すると、同じ内容の2つの異なるファイルに対して、同じmd5ハッシュが生成されます。

例:1.txtおよび2.txtという名前の「stackoverflow」(引用符なし)を含む2つのファイルについて考えます。

_md5_file("1.txt");
md5_file("2.txt");
_

出力します

_73868cb1848a216984dca1b6b0ee37bc
_

md5("stackoverflow")の場合、またはmd5(file_get_contents("1.txt"))またはmd5(file_get_contents("1.txt")).の場合、まったく同じ結果が得られます。

はい、何度か試しました。私の場合、結果は次のとおりです。

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

次のように出力を生成します。

660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2 

これは両方の行で同等のようです。

2
Vishal