Эта тема на forum.dklab.ru


Ischuschiy: Расчёт хэша файлов (md5_file и др.)
Написанной страницы ("PHP5 в подлиннике", стр.330-331) по теме хэшей для меня отказалось недостаточно.
Пытаюсь разобрать более обстоятельно.

1.1.1
Для файлов простые варианты подобные:

$Md5File = md5_file("C:\\test.txt");
echo $Md5File;

--- работают.

1.1.2
Интересно, что конвертация через utf8_encode никоим образом на результат не влияет:

$Md5File = utf8_encode(md5_file("C:\\test.txt"));
echo $Md5File;
или

echo utf8_encode($Md5File);
$Md5File = md5_file("C:\\test.txt");


1.2.1
Однако более сложные функции не работают корректно (хотя установлен PHP 5.1.6, "прописаны" нужные параметры в php.ini: раскомментирована строка extension=php_mhash.dll), а именно - выдают замест хэша неподобающие кракозябры (ни в одной кодировке не отображается по-человечески). Например,

$MhashSHA1 = Mhash(Mhash_SHA1, $input);
echo 'Mhash SHA1: ' . $MhashSHA1;
порождает результат: ? ???㳴?X˫??

1.2.2
Странно, но путем преобразования его через bin2hex:
$MhashSHA1 = bin2hex(Mhash(Mhash_SHA1, $input));
получается уже читаемый код:
bb6e54c2bf965ba331d9b5d384e25ba3

Вопросы:
1. Что за настройки такие? или Где зарыта собака?! Т.е. как получить читаемый двоичный код после подсчёта хэша (вместо нынешнего ? ???㳴?X˫?? ?
2. Как применять функции вида Mhash_XXXX (напр., Mhash_SHA1) к файлам, а не только к строке?
3. В чем разница двух выражений в первого примера из мануала (http://php.net/manual/ru/ref.mhash.php):

$input = "what do ya want for nothing?";
$hash = mhash(MHASH_MD5, $input);
echo "The hash is " . bin2hex($hash) . "<br />\n";
$hash = mhash(MHASH_MD5, $input, "Jefe");
echo "The hmac is " . bin2hex($hash) . "<br />\n";

Maus:
Интересно, что конвертация через utf8_encode никоим образом на результат не влияет
Ничего интересного, внимательнее читайте документацию:
UTF-8 is transparent to plain ASCII characters
Однако более сложные функции не работают корректно
Под PHP4 sha1_file() работает без проблем.
Если Вы считаете, что проблема есть - поищите в багтраке PHP. Если там ничего подобного не описано - проведите дополнительное тестирование (прогоните тот же код на PHP4, используйте не mhash(), а другие функции, дающие тот же результат, проверьте возвращаемые типы и т.д.), составьте и отправьте багрепорт.
Как применять функции вида Mhash_XXXX (напр., Mhash_SHA1) к файлам
А какой ответ на это даёт документация?
В чем разница двух выражений в первого примера из мануала
Читайте внимательно документацию.
Ischuschiy:
>> 1.1
Под PHP4 sha1_file() работает без проблем.
А я и не говорю, что она под PHP5 не работает (простые функции подобные md5_file() работают - см. выше п.1.1.1), проблема вовсе не в подобных простых функциях, а в более сложных (о них в пункте 1.2), которые нужно отдельно специально подключать к PHP.

>> 1.2
Как применять функции вида Mhash_XXXX (напр., Mhash_SHA1) к файлам
А какой ответ на это даёт документация?
В документации описано только как работать со строкой. Как с файлом поступать не знаю.

>> Вопрос-3
В чем разница двух выражений в первого примера из мануала
Читайте внимательно документацию.
.
Документация (http://php.rus-phpnuke.com/f/mhash.html):
string mhash (int hash, string data [, string key])

mhash() применяет хэш-функцию hash к данным data и возвращает результирующий хэш (называемый также digest/дайджест). Если key специфицирован, возвращается результирующий HMAC. HMAC это хэширование с ключам для аутентификации сообщения, либо просто дайджест сообщения, который зависит от специфицированного ключа. Не все алгоритмы, поддерживаемые в mhash, могут использоваться в режиме HMAC. При ошибке возвращает FALSE.
Это обстоятельное описание оказалось вовсе на другой странице (что не логично), на которой однако ни одного примера не привели (что страно).
.
==========
Короче, я практически со всем разобрался, однако:
1) неужели в двоичном виде (как мне представляется в виде нулей и единиц) нельзя увидеть хэш отображённым в браузере?
2) КАК всё-таки ПОЛУЧИТЬ ХЭШ, например, MHASH_TIGER128, (для) ФАЙЛА test.pdf. Нижеприведённый код не работает*:

$InputFile = file('C:\\test.pdf');
$MhashMD5 = bin2hex(Mhash(Mhash_MD5, $InputFile));

* вся соль и сложность в том, что изначально функции вида MHASH_HASHNAME предназначена для работы со строкой. А тем не менее нужно! :(

_____________________________________________________________ Очень надеюсь на Вашу помощь.
Maus:
как работать со строкой. Как с файлом поступать не знаю
прочтите его в строку.
Ischuschiy
При сомнениях в трактовке документации всегда обращайтесь к первоисточнику - в данном случае на http://php.net . Переводная документация вообще редко обновляется, плюс неизвестно, когда она обновлялась на указанном Вами зеркале.
1) неужели в двоичном виде (как мне представляется в виде нулей и единиц) нельзя увидеть хэш отображённым в браузере?
то, что Вам представляется и то, как оно есть на самом деле - несколько разные вещи. Например, если Вы действительно хотите увидеть строку из нулей и единиц - посмотрите в сторону printf() - это первое, что приходит в голову.
Нижеприведённый код не работает
Разумеется. Перепроверьте типы аргументов.

На всякий случай: знать все функции для работы с файлами необязательно, достаточно уметь их находить в мануале.
Ischuschiy:
прочтите его в строку.
Спасибо, Maus, помогло.
Совсем пропустил функцию file_get_contents.
Гость:
Здраствуйте
а напишите пожалуйста простейший скрипт в котором указываеш имя файла на сервере и он считает и выводит MD5 :)
Maus:
а напишите пожалуйста простейший скрипт
подобный скрипт можно написать ,всего лишь почитывая мануал. А Здесь общаются Web-разработчики.

Эта тема на forum.dklab.ru