Signatur
Beschreibung
HashContext ist eine finale, opake Klasse, die den internen Zustand einer laufenden Hash-Berechnung kapselt. Instanzen dieser Klasse werden ausschließlich von hash_init() erzeugt und anschließend mit hash_update(), hash_update_stream() oder hash_update_file() befüllt. Der endgültige Hash-Wert wird mit hash_final() abgerufen.
Der Einsatz eines HashContext-Objekts ist besonders dann sinnvoll, wenn große Datenmengen nicht auf einmal im Speicher gehalten werden können oder wenn der Hash-Vorgang über mehrere Schritte hinweg aufgebaut werden soll, etwa beim Verarbeiten von Upload-Streams oder großen Dateien in Chunks.
Vor PHP 7.2 wurde für denselben Zweck eine interne Ressource (resource) verwendet. Mit der Einführung von HashContext als echtes Objekt ist es möglich, den Kontext zu serialisieren und zu klonen, was zuvor nicht möglich war. clone erstellt eine unabhängige Kopie des aktuellen Hash-Zustands, sodass z. B. ein Zwischen-Hash berechnet werden kann, ohne den ursprünglichen Vorgang zu unterbrechen.
Da die Klasse final ist, kann sie nicht erweitert werden. Sie hat keinen öffentlichen Konstruktor; alle Instanzen werden ausschließlich über die hash_*-Funktionen der Hash-Extension erzeugt.
Beispiele
Inkrementelles Hashen eines großen Datenstroms
<?php
// SHA-256-Hash eines großen Textes, der in mehreren Teilen verarbeitet wird
$ctx = hash_init('sha256');
$chunks = [
'Erster Teil der Nachricht. ',
'Zweiter Teil der Nachricht. ',
'Dritter und letzter Teil.',
];
foreach ($chunks as $chunk) {
hash_update($ctx, $chunk);
}
$hash = hash_final($ctx);
echo $hash . PHP_EOL;
// Zum Vergleich: direkter Hash des kompletten Strings
$full = hash('sha256', implode('', $chunks));
echo ($hash === $full ? 'Identisch' : 'Unterschiedlich') . PHP_EOL;
Klonen eines HashContext für einen Zwischen-Hash
<?php
$ctx = hash_init('md5');
hash_update($ctx, 'Hallo ');
// Klon erstellen, um Zwischenergebnis zu berechnen
$ctxCopy = clone $ctx;
$zwischenHash = hash_final($ctxCopy);
echo 'Zwischen-Hash ("Hallo "): ' . $zwischenHash . PHP_EOL;
// Ursprünglichen Kontext weiterbefüllen
hash_update($ctx, 'Welt');
$finalHash = hash_final($ctx);
echo 'Finaler Hash ("Hallo Welt"): ' . $finalHash . PHP_EOL;
HMAC-Kontext mit hash_init und HASH_HMAC
<?php
$schluessel = 'geheim123';
$ctx = hash_init('sha256', HASH_HMAC, $schluessel);
hash_update($ctx, 'Wichtige Nachricht Teil 1');
hash_update($ctx, ' und Teil 2');
$hmac = hash_final($ctx);
echo 'HMAC-SHA256: ' . $hmac . PHP_EOL;
// Klasse prüfen
echo get_class($ctx) . PHP_EOL; // Gibt 'HashContext' aus, aber $ctx ist bereits finalisiert
// Wichtig · Fallstricke
Serialisierung: HashContext-Objekte sind seit PHP 7.2 serialisierbar. Dies erlaubt es, einen laufenden Hash-Vorgang zwischenzuspeichern (z. B. in einer Session oder Datenbank) und später fortzuführen. Achtung: Bei HMAC-Kontexten wird der geheime Schlüssel im serialisierten Zustand mitgespeichert — der serialisierte String sollte daher niemals in unsicheren Kanälen übertragen werden.
Finalisierung: Nach dem Aufruf von hash_final() ist der HashContext erschöpft und kann nicht mehr verwendet werden. Soll der Zustand nach der Finalisierung weiter genutzt werden, muss vorher ein Klon erstellt werden.
Algorithmen: Alle von hash_algos() zurückgegebenen Algorithmen können mit hash_init() verwendet werden.