Подтвердить что ты не робот

Будет ли 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") ?>

4b9b3361

Ответ 1

Да, они возвращают то же самое:

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() сначала открывает файл.

2nd Edit: В основном функция md5_file() генерирует хеш на основе содержимого файла, а не на метаданных файла, таких как имя файла. Точно так же md5sum работает в системах Linux. См. Этот пример:

[email protected]:~# echo foobar > foo.txt
[email protected]:~# md5sum foo.txt
14758f1afd44c09b7992073ccf00b43d  foo.txt
[email protected]:~# mv foo.txt bar.txt
[email protected]:~# md5sum bar.txt
14758f1afd44c09b7992073ccf00b43d  bar.txt

Ответ 2

на основе содержимого файла, а не на метаданных файла, таких как спецификация или имя файла

Это неверно о спецификации. BOM является частью содержимого файла, вы можете увидеть его три байта в любом редакторе файлов, отличных от юникода.

Ответ 3

md5_file команда просто хеширует содержимое файла с помощью md5.

Если вы ссылаетесь на старую реализацию PHP md5_file (но принцип все тот же) 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;
}

Итак, если вы hash с md5 любой строкой или контентом, вы всегда получите тот же результат, что и md5_file (для той же кодировки и содержимого файла).

В этом случае, если вы hash на md5 - содержимое файла с file_get_content() или если вы используете md5_file или даже если используете команду md5 с тем же содержимым, что и содержимое вашего файла, вы всегда будете получать тот же результат.

Например, вы можете изменить имя файла для файла, а для двух разных файлов с одним и тем же контентом они выдадут один и тот же хэш файл md5.

Пример: Учитывая два файла, содержащие "stackoverflow" (без кавычек) с именем 1.txt и 2.txt

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

выводит

73868cb1848a216984dca1b6b0ee37bc

У вас будет тот же результат, если вы md5("stackoverflow") или если вы md5(file_get_contents("1.txt")) или md5(file_get_contents("1.txt")).

Ответ 4

Да, я пробовал это несколько раз. В моем случае результат для:

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

Произвести вывод как:

660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2 

Что кажется эквивалентным на обеих линиях.