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

Руководство по hash_final в PHP 8 с примерами
Раздел: Хеширование и шифрование
hash_final(HashContext $context, bool $binary = false): string

Функция hash_final() в PHP завершает инкрементальное хеширование и возвращает итоговый хеш. Она используется после последовательных вызовов hash_update() для обработки больших объемов данных без загрузки их целиком в память.

Описание аргументов

Функция имеет два параметра:

  • $context (обязательный) - ресурс контекста хеширования, возвращаемый функцией hash_init().
  • $binary (опциональный, по умолчанию false) - если установлен в true, функция возвращает необработанные бинарные данные. При false возвращается строка в шестнадцатеричном формате (hexits).

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

Базовое использование
<?php
$ctx = hash_init('md5');
hash_update($ctx, 'Hello');
hash_update($ctx, 'World');
$result = hash_final($ctx);
echo $result;
?>
68e109f0f40ca72a15e05cc22786f8e6
Возврат бинарных данных
<?php
$ctx = hash_init('sha256', HASH_HMAC, 'secret-key');
hash_update($ctx, 'message');
$binary = hash_final($ctx, true);
echo bin2hex($binary);
?>
8f434346648f6b96df89dda901c5176b10a6d83961dd3c1ac88b59b2dc327aa4

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

Создает хеш строки за один вызов. Удобна для обработки данных, которые уже находятся в памяти целиком.

Генерирует хеш с ключом (HMAC) за один шаг. Используется для проверки целостности и подлинности данных.

hash_hkdf()

Производит вывод ключей HKDF. Применяется в криптографических протоколах для расширения ключей.

Инкрементальные функции (hash_init(), hash_update(), hash_final()) предпочтительнее для потоковой обработки больших файлов или данных, поступающих частями.

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

Python (hashlib)
import hashlib
m = hashlib.sha256()
m.update(b'Hello')
m.update(b'World')
print(m.hexdigest())
872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4

Аналогичный инкрементальный подход. Python требует явного приведения к bytes.

JavaScript (Node.js crypto)
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.update('Hello');
hash.update('World');
console.log(hash.digest('hex'));
872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4

Метод digest() аналогичен hash_final(). Работает только с бинарными данными или строками.

Hash final в MySQL

SELECT MD5(CONCAT('Hello', 'World'))
68e109f0f40ca72a15e05cc22786f8e6

Функции хеширования в MySQL (MD5, SHA2) работают только с полными данными, инкрементальная обработка отсутствует.

Типичные ошибки

Использование неинициализированного ресурса
<?php
$ctx = null;
$result = hash_final($ctx);
?>
TypeError: hash_final(): Argument #1 ($context) must be of type HashContext, null given
Повторный вызов hash_final()
<?php
$ctx = hash_init('sha1');
hash_update($ctx, 'test');
$r1 = hash_final($ctx);
$r2 = hash_final($ctx);
echo $r2;
?>
Warning: hash_final(): supplied resource is not a valid HashContext resource

Контекст становится невалидным после первого вызова hash_final().

Использование после hash_final()
<?php
$ctx = hash_init('md5');
$result = hash_final($ctx);
hash_update($ctx, 'more');
?>
Warning: hash_update(): supplied resource is not a valid HashContext resource

Изменения в PHP

PHP 8.0

Тип параметра $context изменен с ресурса (resource) на объект HashContext. Функция теперь выбрасывает TypeError при неверном типе аргумента.

PHP 7.2.0

Добавлена поддержка параметра $binary для контекстов HMAC.

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

Обработка больших файлов
Пример php
<?php
function hash_large_file($filename, $algorithm = 'sha256') {
    $ctx = hash_init($algorithm);
    $handle = fopen($filename, 'rb');
    while (!feof($handle)) {
        $chunk = fread($handle, 8192);
        hash_update($ctx, $chunk);
    }
    fclose($handle);
    return hash_final($ctx);
}
echo hash_large_file('large_file.iso');
?>
a7f4e... (хеш файла)
HMAC с несколькими обновлениями
Пример php
<?php
$ctx = hash_init('sha3-256', HASH_HMAC, 'ключ');
hash_update($ctx, 'Часть1');
hash_update($ctx, 'Часть2');
$hmac = hash_final($ctx);
echo $hmac;
?>
9b5c6... (HMAC-SHA3-256)
Сравнение двух потоков данных
Пример php
<?php
$ctx1 = hash_init('crc32b');
$ctx2 = hash_init('crc32b');
hash_update($ctx1, 'Данные1');
hash_update($ctx2, 'Данные2');
$hash1 = hash_final($ctx1);
$hash2 = hash_final($ctx2);
var_dump($hash1 === $hash2);
?>
bool(false)
Использование с hash_copy()
Пример php
<?php
$ctx = hash_init('md5');
hash_update($ctx, 'Общие данные');
$ctx_copy = hash_copy($ctx);
hash_update($ctx, 'Ветка1');
hash_update($ctx_copy, 'Ветка2');
echo "Ветка1: " . hash_final($ctx) . "\n";
echo "Ветка2: " . hash_final($ctx_copy);
?>
Ветка1: 8d5e0...
Ветка2: f2a34...

PHP hash_final function comments

En
Hash final Finalize an incremental hash and return resulting digest