Вопрос по php – Будет ли md5 (file_contents_as_string) равным md5_file (/ path / to / file)?

28

Если я сделаю:

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

... будет ли всегда выдавать тот же хеш

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

[в ответ на удалённый комментарий] я мог бы сам попробовать. Я просто волнуюсь, что если я получу совпадение и начну сравнивать md5 () с md5_file (), то могут возникнуть проблемы, которые приводят к разным хешам - возможно, это связано с директивами php_ini или какими-то такими вещами, которые будут в моей голове, что быть кошмаром для отладки / идентификации. Tom
Хм, точно не могу сказать, но если файл содержит знак заказа байта и строка не тогда хэши не будут равны. vcsjones

Ваш Ответ

4   ответа
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. (Строки 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
3

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

Если вы ссылаетесь на старую реализацию PHP md5_file (но принцип остается прежним)источни :

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 команда с тем же содержанием, что и содержимое вашего файла, вы всегда получите тот же результат.

Например, вы можете изменить имя файла для файла, и для двух разных файлов с одинаковым содержимым они создадут одинаковый хэш 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")).

Источник, на который вы ссылаетесь, является старой реализацией функции PHP. Но объяснение хорошее. prehfeldt
У тебя есть новая ссылка? У меня нет бесплатного доступа в Интернет, и поэтому многие сайты заблокированы здесь. Если у вас есть новый источник, я обновлю свой пост. Pier-Alexandre Bouchard
@ pier-alexandre-bouchard он опубликовал ссылку на рассматриваемый исходный код php в своем собственном ответе. :) damianb
@ damianb Я говорил о реализации PHP md5_file из исходного кода PHP. Pier-Alexandre Bouchard
В PHP нет более новой реализации, потому что она стала частью дистрибутива PHP и была переписана на C несколько лет назад. prehfeldt
3

а не на метаданных файла, таких как спецификация или имя файла

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

Это должен быть комментарий к ответу, от которого ваша цитата, а не сам по себе ответ. BHSPitMonkey
2

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

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

Продукция выводится как:

660d4e394937c10cd1c16a98f44457c2
660d4e394937c10cd1c16a98f44457c2 

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

Похожие вопросы