Hash update: примеры (PHP)
hash_update(HashContext $context, string $data): boolФункция hash_update() в PHP предназначена для инкрементального добавления данных в контекст хеширования. Она используется при необходимости вычисления хеш-суммы от данных, которые становятся доступны постепенно или не помещаются в память целиком, например, при обработке больших файлов или потоков данных.
Функция принимает два обязательных параметра:
- context (HashContext) – контекст хеширования, созданный функцией
hash_init(). - data (string) – строка с данными, которые необходимо добавить к уже обработанным для вычисления хеша.
Функция возвращает true при успешном обновлении контекста.
Вычисление 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
hash() – вычисляет хеш от строки целиком. Удобна для работы с небольшими данными, которые уже находятся в памяти. Не требует создания контекста.
hash_file() – вычисляет хеш от содержимого файла. Оптимальна для работы с файлами, не требует чтения файла в память.
hash_hmac() – создает хеш с ключом (HMAC) от строки. Используется для проверки целостности и подлинности данных.
Инкрементальные функции (hash_init/hash_update/hash_final) предпочтительны при потоковой обработке или работе с большими объемами данных.
import hashlib
hasher = hashlib.sha256()
hasher.update(b'Первая часть')
hasher.update(b'Вторая часть')
print(hasher.hexdigest())a1b2... (хеш)
В Python методы update() также работают инкрементально, но объект хеша создается напрямую из модуля hashlib.
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 8.0 функция hash_update() стала строго типизированной. Аргумент $context теперь должен быть типа HashContext, а не ресурсом (resource). Это изменение было частью общей инициативы по замене ресурсов на объекты.
В PHP 7.2 была добавлена поддержка контекста типа HashContext, но обратная совместимость с ресурсом сохранялась до PHP 8.0.
$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...
$key = 'секретный ключ';
$ctx = hash_init('sha256', HASH_HMAC, $key);
hash_update($ctx, 'Данные для аутентификации');
hash_update($ctx, 'Дополнительные данные');
$hmac = hash_final($ctx);
echo $hmac;f5d7e3a9... (HMAC)
$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...