Signatur
Beschreibung
hash_final() beendet eine inkrementelle Hash-Berechnung, die zuvor mit hash_init() initialisiert und optional durch mehrere Aufrufe von hash_update(), hash_update_stream() oder hash_update_file() mit Daten gespeist wurde. Das Ergebnis ist der fertige Hash des gesamten verarbeiteten Datenmaterials.
Diese Funktion ist besonders nützlich, wenn große Datenmengen stückweise verarbeitet werden sollen – etwa beim Hashen von Dateiströmen oder Netzwerkdaten –, ohne dass alle Daten gleichzeitig im Arbeitsspeicher gehalten werden müssen. Typische Anwendungsfälle sind das Prüfen der Integrität von Dateiuploads, das Berechnen von Checksums über gestreamte Inhalte oder das Erstellen von HMACs für API-Authentifizierung.
Der Parameter $binary steuert das Ausgabeformat: Bei false (Standard) wird ein hexadezimaler Kleinbuchstaben-String zurückgegeben, bei true ein roher Binär-String. Der Binärmodus ist effizienter für die weitere maschinelle Verarbeitung, z. B. als Eingabe für eine Base64-Kodierung.
Hinweis: Ab PHP 7.2.0 erwartet hash_final() ein HashContext-Objekt anstelle einer Ressource. Nach dem Aufruf von hash_final() ist das Kontext-Objekt nicht mehr verwendbar. Soll der aktuelle Zwischenstand gespeichert werden, ohne den Kontext zu verwerfen, ist hash_copy() das Mittel der Wahl.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $context Pflicht | HashContext | Ein HashContext-Objekt, das zuvor mit hash_init() erzeugt wurde. Nach dem Aufruf von hash_final() ist der Kontext verbraucht und kann nicht weiter genutzt werden. |
|
| $binary | bool | false | Legt das Ausgabeformat fest: false liefert einen hexadezimalen Kleinbuchstaben-String (z. B. "a9993e36..."), true liefert rohe Binärdaten. |
Rückgabewert
$binary auf true gesetzt wurde.Beispiele
SHA-256-Hash einer Zeichenkette schrittweise berechnen
<?php
// Kontext für SHA-256 initialisieren
$ctx = hash_init('sha256');
// Daten in mehreren Schritten hinzufügen
hash_update($ctx, 'Hallo, ');
hash_update($ctx, 'Welt!');
// Hash abschließen und ausgeben
$hash = hash_final($ctx);
echo $hash;
Dateiinhalt stückweise hashen (speichereffizient)
<?php
$filename = '/var/www/uploads/largefile.zip';
$ctx = hash_init('sha256');
$fp = fopen($filename, 'rb');
if ($fp === false) {
throw new RuntimeException('Datei konnte nicht geöffnet werden.');
}
// Datei in 8-KB-Blöcken lesen und dem Hash-Kontext übergeben
while (!feof($fp)) {
$chunk = fread($fp, 8192);
hash_update($ctx, $chunk);
}
fclose($fp);
$checksum = hash_final($ctx);
echo 'SHA-256-Prüfsumme: ' . $checksum . PHP_EOL;
HMAC schrittweise berechnen und als Base64 ausgeben
<?php
$secret = 'mein-geheimnis';
$ctx = hash_init('sha256', HASH_HMAC, $secret);
hash_update($ctx, 'Nutzdaten-Teil-1');
hash_update($ctx, 'Nutzdaten-Teil-2');
// Binärer Hash als Eingabe für Base64
$rawHash = hash_final($ctx, true);
$base64 = base64_encode($rawHash);
echo 'HMAC-SHA256 (Base64): ' . $base64 . PHP_EOL;
// Wichtig · Fallstricke
Kontext nach Aufruf verbraucht: Nach dem Aufruf von hash_final() kann der übergebene HashContext nicht wiederverwendet werden. Soll ein Zwischenstand gespeichert oder der Kontext für mehrere Endwerte genutzt werden, muss zuvor hash_copy() aufgerufen werden.
Ressource vs. Objekt: Vor PHP 7.2.0 lieferte hash_init() eine Ressource zurück. Seit PHP 7.2.0 wird ein HashContext-Objekt verwendet. Code, der auf Ressourcen prüft (z. B. is_resource()), muss entsprechend angepasst werden.
Algorithmuswahl: Für kryptografische Zwecke (Passwörter, Signaturen) sollten ausschließlich sichere Algorithmen wie sha256, sha3-256 oder blake2b512 verwendet werden. Für Passwörter ist password_hash() die empfohlene Alternative.