Signatur
Beschreibung
hash_update_stream ermöglicht es, Daten direkt aus einem Stream-Resource (z. B. eine geöffnete Datei, ein Netzwerk-Socket oder ein In-Memory-Stream) in einen laufenden Hash-Berechnungsprozess einzuspeisen. Dadurch müssen große Datenmengen nicht komplett in den Arbeitsspeicher geladen werden, bevor sie gehasht werden können.
Typisches Einsatzgebiet ist das Berechnen eines Checksums oder MAC (Message Authentication Code) für Dateien beliebiger Größe, ohne Speicherlimits zu riskieren. Der $length-Parameter erlaubt es, nur einen bestimmten Teil des Streams zu verarbeiten — wird er auf -1 belassen, wird bis zum Ende des Streams gelesen.
Die Funktion kann mehrfach auf denselben HashContext angewendet werden, auch abwechselnd mit hash_update und hash_update_file. Die endgültige Hash-Summe wird erst durch hash_final (oder hash/hash_file) abgerufen.
Der übergebene Stream muss bereits geöffnet und lesbar sein. Der interne Stream-Zeiger wird nach dem Lesen entsprechend verschoben; er wird von der Funktion nicht automatisch zurückgesetzt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $context Pflicht | HashContext | Ein aktiver Hash-Kontext, der zuvor mit hash_init erzeugt wurde. |
|
| $stream Pflicht | resource | Ein geöffneter, lesbarer Stream (z. B. Rückgabewert von fopen). Der Zeiger im Stream wird nach dem Lesen verschoben. |
|
| $length | int | -1 | Maximale Anzahl der zu lesenden Bytes. Bei -1 wird bis zum Ende des Streams gelesen. |
Rückgabewert
Beispiele
SHA-256-Prüfsumme einer großen Datei berechnen
<?php
// Datei-Hash berechnen, ohne die gesamte Datei in den Speicher zu laden
$context = hash_init('sha256');
$stream = fopen('/pfad/zur/grossen-datei.bin', 'rb');
if ($stream === false) {
throw new RuntimeException('Datei konnte nicht geöffnet werden.');
}
$bytesGelesen = hash_update_stream($context, $stream);
fclose($stream);
$hash = hash_final($context);
echo "Gelesene Bytes: $bytesGelesen\n";
echo "SHA-256: $hash\n";
Nur die ersten 1024 Bytes eines HTTP-Streams hashen
<?php
// Ersten 1 KB einer Remote-Ressource hashen
$context = hash_init('md5');
$stream = fopen('https://example.com/daten.txt', 'rb');
if ($stream === false) {
throw new RuntimeException('Stream konnte nicht geöffnet werden.');
}
$bytesGelesen = hash_update_stream($context, $stream, 1024);
fclose($stream);
$hash = hash_final($context);
echo "Gelesene Bytes: $bytesGelesen\n";
echo "MD5 (erste 1024 Bytes): $hash\n";
Kombination mit hash_update für gemischte Datenquellen
<?php
// Hash aus kombinierter Quelle: feste Zeichenkette + Stream-Inhalt
$context = hash_init('sha1');
// Erst feste Daten hinzufügen
hash_update($context, 'Präfix:');
// Dann Stream-Daten anhängen
$stream = fopen('php://memory', 'rb+');
fwrite($stream, 'Stream-Inhalt');
rewind($stream);
hash_update_stream($context, $stream);
fclose($stream);
echo hash_final($context) . "\n";
// Wichtig · Fallstricke
Sicherheitshinweis: Verwende für sicherheitskritische Anwendungen (z. B. HMAC-basierte Integritätsprüfungen) hash_init mit dem Flag HASH_HMAC und einem geheimen Schlüssel, anstatt einen einfachen Hash zu berechnen.
Streamzeiger: Der interne Zeiger des Streams wird nicht automatisch zurückgesetzt. Wenn du denselben Stream erneut verarbeiten möchtest, musst du rewind oder fseek aufrufen.
Rückgabewert: Der zurückgegebene int gibt die tatsächlich gelesenen Bytes an, die kleiner als $length sein können, wenn das Stream-Ende vorher erreicht wurde.
Ab PHP 8.0 ist der erste Parameter vom Typ HashContext (Objekt) anstelle der früheren opaken Resource.