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

Руководство по инкрементальному хешированию с hash_update
Раздел: Хеширование и шифрование
hash_update(HashContext $context, string $data): bool
Описание функции hash_update

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

Аргументы функции

Функция принимает два обязательных параметра:

  • context (HashContext) – контекст хеширования, созданный функцией hash_init().
  • data (string) – строка с данными, которые необходимо добавить к уже обработанным для вычисления хеша.

Функция возвращает true при успешном обновлении контекста.

Примеры использования hash_update
Базовое инкрементальное хеширование

Вычисление MD5 хеша от данных, передаваемых частями:

$context = hash_init('md5');
hash_update($context, 'Первая часть данных');
hash_update($context, 'Вторая часть данных');
$hash = hash_final($context);
echo $hash;
cd7e3c2e3a4e5b4e5b4e5b4e5b4e5b4e
Использование с различными алгоритмами

Пример с алгоритмом SHA256:

$ctx = hash_init('sha256');
hash_update($ctx, 'Тестовые ');
hash_update($ctx, 'данные');
echo hash_final($ctx);
a1b2c3d4e5f678901234567890123456789012345678901234567890123456
Похожие функции в PHP

hash() – вычисляет хеш от строки целиком. Удобна для работы с небольшими данными, которые уже находятся в памяти. Не требует создания контекста.

hash_file() – вычисляет хеш от содержимого файла. Оптимальна для работы с файлами, не требует чтения файла в память.

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

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

Аналоги в других языках
Python (hashlib)
import hashlib
hasher = hashlib.sha256()
hasher.update(b'Первая часть')
hasher.update(b'Вторая часть')
print(hasher.hexdigest())
a1b2... (хеш)

В Python методы update() также работают инкрементально, но объект хеша создается напрямую из модуля hashlib.

JavaScript (Node.js, crypto)
const crypto = require('crypto');
const hash = crypto.createHash('sha256');
hash.update('Первая часть');
hash.update('Вторая часть');
console.log(hash.digest('hex'));
a1b2... (хеш)

В Node.js используется похожий потоковый подход. В браузерном JavaScript доступны методы Web Crypto API.

Hash update в MySQL

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

Типичные ошибки
Передача некорректного контекста
// Попытка использовать строку вместо контекста
hash_update('not_a_context', 'data');
TypeError: hash_update(): Argument #1 ($context) must be of type HashContext, string given
Использование завершенного контекста
$ctx = hash_init('md5');
hash_final($ctx);
// Контекст уже закрыт
hash_update($ctx, 'new data');
Warning: hash_update(): supplied resource is not a valid HashContext resource
Ошибка кодировки данных
// Передача массива вместо строки
$ctx = hash_init('sha1');
hash_update($ctx, ['data']);
TypeError: hash_update(): Argument #2 ($data) must be of type string, array given
Изменения в версиях PHP

В PHP 8.0 функция hash_update() стала строго типизированной. Аргумент $context теперь должен быть типа HashContext, а не ресурсом (resource). Это изменение было частью общей инициативы по замене ресурсов на объекты.

В PHP 7.2 была добавлена поддержка контекста типа HashContext, но обратная совместимость с ресурсом сохранялась до PHP 8.0.

Расширенные примеры
Хеширование потока данных из файла
Пример php
$context = hash_init('sha3-256');
$file = fopen('large_video.mp4', 'rb');
while (!feof($file)) {
    $chunk = fread($file, 8192);
    hash_update($context, $chunk);
}
fclose($file);
$fileHash = hash_final($context);
echo 'Хеш файла: ' . $fileHash;
Хеш файла: 4e2a3b1c...
Создание HMAC инкрементально
Пример php
$key = 'секретный ключ';
$ctx = hash_init('sha256', HASH_HMAC, $key);
hash_update($ctx, 'Данные для аутентификации');
hash_update($ctx, 'Дополнительные данные');
$hmac = hash_final($ctx);
echo $hmac;
f5d7e3a9... (HMAC)
Одновременное вычисление нескольких хешей
Пример php
$algorithms = ['md5', 'sha1', 'sha256'];
$contexts = [];
foreach ($algorithms as $algo) {
    $contexts[$algo] = hash_init($algo);
}
$dataChunks = ['часть1', 'часть2', 'часть3'];
foreach ($dataChunks as $chunk) {
    foreach ($contexts as $ctx) {
        hash_update($ctx, $chunk);
    }
}
foreach ($contexts as $algo => $ctx) {
    echo $algo . ': ' . hash_final($ctx) . "\n";
}
md5: 8d3c6a...
sha1: 1a2b3c...
sha256: 4e5f6a...

PHP hash_update function comments

En
Hash update Pump data into an active hashing context