Hash file: примеры (PHP)

Работа с hash_file в PHP: вычисление хеш-суммы файлов
Раздел: Хеширование и шифрование
hash_file(string $algo, string $filename, bool $binary = false, array $options = []): string|false

Основные сведения о hash_file

Функция hash_file в PHP предназначена для вычисления хеш-суммы файла. Её использование актуально для проверки целостности данных, верификации загруженных файлов, сравнения содержимого или создания уникальных идентификаторов на основе файла.

Синтаксис и параметры

Функция имеет следующий синтаксис:

hash_file(string $algo, string $filename, bool $binary = false, array $options = []): string|false
  • $algo (string): Название алгоритма хеширования (например, 'md5', 'sha256', 'sha3-512'). Список доступных алгоритмов возвращает функция hash_algos().
  • $filename (string): Путь к файлу, для которого вычисляется хеш.
  • $binary (bool, необязательный): При значении true функция возвращает сырые двоичные данные. По умолчанию false — возвращается строка в шестнадцатеричном формате.
  • $options (array, необязательный): Ассоциативный массив с дополнительными опциями. Для некоторых алгоритмов (например, 'sha3-512') позволяет задать размер вывода.

Функция возвращает хеш-сумму в виде строки или false в случае ошибки (например, если файл не найден или алгоритм не поддерживается).

Базовые примеры использования

Вычисление MD5 и SHA256 хешей
// Файл example.txt с содержимым 'Hello World'
$md5Hash = hash_file('md5', 'example.txt');
echo "MD5: " . $md5Hash;
MD5: b10a8db164e0754105b7a99be72e3fe5
$sha256Hash = hash_file('sha256', 'example.txt');
echo "SHA256: " . $sha256Hash;
SHA256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
Использование двоичного вывода
$binaryHash = hash_file('sha1', 'example.txt', true);
echo "SHA1 (binary, base64): " . base64_encode($binaryHash);
SHA1 (binary, base64): Lve95gjOVATpfV8EL5X4NXwTSKw=
Использование параметров (опция 'length' для SHA3)
$options = ['length' => 256];
$sha3Hash = hash_file('sha3-512', 'example.txt', false, $options);
echo "SHA3-512 (256 bit): " . $sha3Hash;
SHA3-512 (256 bit): 3d58a719c6866b0214f96b0a67b37e51a91e233ce0be126a08f35fdf4c043c12

Похожие функции в PHP

  • hash: Вычисляет хеш-сумму строки. Применяется для данных, уже находящихся в памяти.
  • md5_file и sha1_file: Специализированные функции для конкретных алгоритмов. Удобны для простых случаев, но hash_file более универсальна.
  • crypt: Функция для хеширования паролей, использующая различные алгоритмы (например, CRYPT_BLOWFISH). Не предназначена для файлов.
  • hash_init + hash_update_file + hash_final: Позволяют инкрементально обрабатывать данные, что полезно для потоковой обработки больших файлов без загрузки в память.

Функция hash_file предпочтительнее для прямого вычисления хеша целого файла, когда не требуется инкрементальная обработка.

Аналоги в других языках программирования

Python
import hashlib
with open('example.txt', 'rb') as f:
    file_hash = hashlib.sha256(f.read()).hexdigest()
print(file_hash)
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

В Python используется модуль hashlib. Файл обычно считывается в память, но для больших файлов можно использовать метод update() для блочного чтения.

JavaScript (Node.js)
const crypto = require('crypto');
const fs = require('fs');
const hash = crypto.createHash('sha256');
const input = fs.createReadStream('example.txt');
input.on('readable', () => {
  const data = input.read();
  if (data) hash.update(data);
  else console.log(hash.digest('hex'));
});
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

В Node.js хеширование файлов реализуется через потоковое API криптографического модуля.

MySQL
-- Для строк, не для файлов
SELECT SHA2('Hello World', 256);
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

В MySQL нет прямой функции для хеширования файлов. Хешируются строковые значения в запросах.

Распространенные ошибки

Файл не найден
$hash = hash_file('md5', 'non_existent_file.txt');
if ($hash === false) {
    echo "Ошибка вычисления хеша. Проверьте путь к файлу.";
}
Ошибка вычисления хеша. Проверьте путь к файлу.
Неверное имя алгоритма
$hash = hash_file('unknown_algo', 'example.txt');
if ($hash === false) {
    echo "Алгоритм не поддерживается.";
}
Алгоритм не поддерживается.
Попытка хеширования директории
// Если 'some_directory' - папка
$hash = hash_file('md5', 'some_directory');
var_dump($hash);
bool(false)

Функция ожидает путь к файлу. Для директории вернет false.

Изменения в последних версиях PHP

  • PHP 8.1.0: Удален алгоритм хеширования 'adler32'. Его использование теперь вызывает исключение ValueError.
  • PHP 8.0.0: Параметр $options стал необязательным. Ранее требовалось передавать значение, даже если оно не использовалось.
  • PHP 7.4.0: Добавлена поддержка параметра $options для алгоритмов семейства SHA-3, позволяющая указывать размер вывода.
  • PHP 7.2.0-7.3.0: Были добавлены новые алгоритмы, такие как 'sha3-256', 'sha3-512', 'crc32c'.

Расширенные примеры применения

Проверка целостности загруженного файла
Пример php
// Предположим, ожидаемый хеш файла известен
$expectedHash = 'b10a8db164e0754105b7a99be72e3fe5';
$uploadedFile = $_FILES['userfile']['tmp_name'];
$actualHash = hash_file('md5', $uploadedFile);
if ($expectedHash === $actualHash) {
    echo "Файл прошел проверку целостности.";
} else {
    echo "Файл поврежден или изменен.";
}
Сравнение двух файлов без загрузки в память
Пример php
$file1 = 'file1.iso';
$file2 = 'file2.iso';
if (hash_file('sha256', $file1) === hash_file('sha256', $file2)) {
    echo "Файлы идентичны.";
} else {
    echo "Файлы различаются.";
}
Генерация уникального ключа кэширования для файла
Пример php
$configFile = 'config.json';
$cacheKey = 'config_' . hash_file('crc32c', $configFile);
echo "Ключ кэша: $cacheKey";
// Если файл изменится, ключ тоже изменится
Пакетное хеширование нескольких файлов
Пример php
$files = ['image1.jpg', 'document.pdf', 'archive.zip'];
$hashes = [];
foreach ($files as $file) {
    if (is_file($file)) {
        $hashes[$file] = hash_file('sha1', $file);
    }
}
print_r($hashes);
Использование контекста потоков (stream context)
Пример php
// Хеширование файла по URL (если allow_url_fopen включен)
$context = stream_context_create(['http' => ['timeout' => 30]]);
$url = 'https://example.com/largefile.zip';
$tempFile = tempnam(sys_get_temp_dir(), 'dl_');
copy($url, $tempFile, $context);
$hash = hash_file('sha256', $tempFile);
unlink($tempFile);
echo "Хеш удаленного файла: $hash";

PHP hash_file function comments

En
Hash file Generate a hash value using the contents of a given file