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 в случае ошибки (например, если файл не найден или алгоритм не поддерживается).
Базовые примеры использования
// Файл 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=
$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 предпочтительнее для прямого вычисления хеша целого файла, когда не требуется инкрементальная обработка.
Аналоги в других языках программирования
import hashlib
with open('example.txt', 'rb') as f:
file_hash = hashlib.sha256(f.read()).hexdigest()
print(file_hash)a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
В Python используется модуль hashlib. Файл обычно считывается в память, но для больших файлов можно использовать метод update() для блочного чтения.
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 криптографического модуля.
-- Для строк, не для файлов
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'.
Расширенные примеры применения
// Предположим, ожидаемый хеш файла известен
$expectedHash = 'b10a8db164e0754105b7a99be72e3fe5';
$uploadedFile = $_FILES['userfile']['tmp_name'];
$actualHash = hash_file('md5', $uploadedFile);
if ($expectedHash === $actualHash) {
echo "Файл прошел проверку целостности.";
} else {
echo "Файл поврежден или изменен.";
}$file1 = 'file1.iso';
$file2 = 'file2.iso';
if (hash_file('sha256', $file1) === hash_file('sha256', $file2)) {
echo "Файлы идентичны.";
} else {
echo "Файлы различаются.";
}$configFile = 'config.json';
$cacheKey = 'config_' . hash_file('crc32c', $configFile);
echo "Ключ кэша: $cacheKey";
// Если файл изменится, ключ тоже изменится$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);// Хеширование файла по 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";