33

私が行った場合:

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

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

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

4

4 に答える 4

35

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

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()関数は、ファイル名のようなファイルのメタデータではなく、ファイルの内容に基づいてハッシュを生成します。これは、md5sumLinuxシステムでの動作と同じ方法です。この例を参照してください。

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
于 2012-05-24T14:02:30.263 に答える
3

BOM やファイル名などのファイル メタデータではなく、ファイルの内容に基づく

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

于 2014-12-20T05:42:21.237 に答える
3

md5_fileコマンドは、ファイルの内容を 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()or を使用した場合、またはファイルの内容と同じ内容のコマンドを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")).

于 2012-05-24T14:05:56.887 に答える
2

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

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

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

660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2 

両方の行で同等のようです。

于 2012-05-24T14:29:56.293 に答える