Start · Sprachen · PHP · Referenz · hash_update_stream

hash_update_stream

Funktion

Liest Daten aus einem geöffneten Stream und fügt sie einem aktiven Hash-Kontext hinzu.

seit PHP 5.1.2 Kategorie: crypto

Signatur

hash_update_stream(HashContext $context, resource $stream, int $length = -1): int

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

Typ
int
Beschreibung
Die tatsächliche Anzahl der Bytes, die aus dem Stream gelesen und dem Hash-Kontext hinzugefügt wurden.

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";
Gelesene Bytes: 10485760 SHA-256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

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";
Gelesene Bytes: 1024 MD5 (erste 1024 Bytes): d41d8cd98f00b204e9800998ecf8427e

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";
3a76b2dd0cfc31f12f0f69bfd3e77ce0d8e8ccf3

// 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.