Aktueller Standort: Startseite> Neueste Artikel> Leistungsvergleich der Verwendung von Hash_Update_Stream () anstelle von Hash_file ()

Leistungsvergleich der Verwendung von Hash_Update_Stream () anstelle von Hash_file ()

M66 2025-06-05

In PHP wird die Datei -Hash -Berechnung normalerweise in Szenarien wie Datenintegritätsüberprüfung, Dateideduplizierung, digitalen Signaturen usw. verwendet. Bei der Verarbeitung großer Dateien sind Hash_File () und Hash_Update_Stream () gemeinsame Hash -Berechnungsmethoden. Obwohl die beiden ähnliche Funktionen haben, gibt es einige Leistungsunterschiede. Dieser Artikel vergleichen die Leistungsunterschiede zwischen diesen beiden Methoden bei der Verarbeitung großer Dateien und hilft Entwicklern, die richtigen Funktionen besser auszuwählen, um die Effizienz ihrer Anwendungen zu verbessern.

1. Einführung in Hash_File ()

Die Funktion von Hash_File () wird verwendet, um den Hash -Wert der angegebenen Datei direkt zu berechnen. Die Syntax ist wie folgt:

 string hash_file ( string $algo , string $filename [, bool $binary = false ] )
  • $ algo : Gibt den Hashing -Algorithmus an, wie MD5 , SHA256 usw.

  • $ Dateiname : Dateipfad, in dem die Datei angezeigt wird, um den Hash -Wert zu berechnen.

  • $ BINARY : Wenn wahr , geben Sie den binären Hash -Wert zurück; Wenn falsch , geben Sie den hexadezimalen Hash -Wert zurück.

Berechnen Sie beispielsweise den SHA256 -Hash -Wert einer Datei:

 $fileHash = hash_file('sha256', 'largefile.txt');

Hash_file () ist ein sehr einfacher Weg, da es automatisch die gesamte Datei liest und den Hash -Wert berechnet. Bei der Verarbeitung großer Dateien kann das direkte Lesen der gesamten Datei jedoch zu einem hohen Speicherverbrauch führen, insbesondere in Umgebungen mit begrenzten Speicherressourcen.

2. Einführung in Hash_Update_Stream ()

Im Gegensatz zu Hash_File () ist Hash_Update_Stream () eine Methode zur Berechnung von Hash -Werten in Segmenten, mit der der Dateiinhalt bei der Berechnung von Hash Schritt für Schritt gelesen werden kann. Dies ist besonders nützlich für große Dateien, da die gesamte Datei nicht sofort in den Speicher geladen werden muss, sondern durch Block verarbeitet werden kann.

 bool hash_update_stream ( resource $context , string $data [, int $length = 0 ] )
  • $ context : ist ein Hash -Kontext, der über Hash_init () erstellt wurde.

  • $ Daten : Teil der zu berechneten Daten.

  • $ Länge : Optionaler Parameter, Angabe der Länge der zu gelesenen Daten.

Die grundlegenden Schritte zur Berechnung eines großen Datei -Hashs sind wie folgt:

 $hashContext = hash_init('sha256');  // Initialisieren Sie den Hash -Kontext
$handle = fopen('largefile.txt', 'rb');  // Öffnen Sie die Datei

while (!feof($handle)) {
    $data = fread($handle, 8192);  // Lesen Sie Dateien in Stücken
    hash_update_stream($hashContext, $data);  // Aktualisieren Sie Hash
}

$hash = hash_final($hashContext);  // Holen Sie sich den endgültigen Hash -Wert
fclose($handle);

Durch das Lesen von Dateien in Töpfen und die allmählich Aktualisierung von Hash -Werten kann diese Methode effektiver verwalten und eignen sich für die Verarbeitung großer Dateien.

3.. Leistungsdifferenzanalyse

3.1 Speicherverbrauch

  • Hash_File () : Diese Funktion lädt die gesamte Datei gleichzeitig in Speicher für die Hash -Berechnung, die für Situationen geeignet ist, in denen die Dateigröße moderat ist. Wenn die Datei sehr groß ist (z. B. mehrere GB), verursacht sie übermäßige Speicherverwendung und führt sogar zu Speicherüberlauffehlern.

  • Hash_Update_Stream () : Diese Methode liest die Datei Schritt für Schritt und aktualisiert den Hash -Wert, sodass die Speicherverwendung niedriger ist. Für große Dateien hat Hash_Update_Stream () mehr Vorteile, da sie nur in jedem Lesedateiblock Daten gespeichert werden, wodurch die hohe Speicheranforderung für das Laden der gesamten Datei vermieden wird.

3.2 Geschwindigkeitsunterschied

In Bezug auf die Geschwindigkeit hat Hash_File () normalerweise eine höhere Leistung, da es sich um eine zugrunde liegende Funktion handelt, die die Funktion des Betriebssystems direkt aufruft, ohne zusätzliche Speicherzuweisung oder -verarbeitung zu erfordern. Mit zunehmender Dateigröße kann die Leistung jedoch durch Speicherbeschränkungen beeinflusst werden.

Im Gegensatz dazu erfordert Hash_Update_Stream () mehr Codeausführungslogik (z. B. Chunked Reading und schrittweise Aktualisierung von Hash), aber im Umgang mit großen Dateien ist die Gesamtleistung aufgrund einer effizienteren Speicherverwaltung in der Regel besser.

3.3 Flexibilität

Hash_update_stream () bietet mehr Flexibilität. Entwickler können die Größe jeder Lesedatei (angegeben von Fread () ) steuern, um ein Gleichgewicht zwischen Speicher Fußabdruck und Geschwindigkeit zu finden. Für große Dateien kann die Größe des Leseblocks gemäß dem Speicher des Servers angepasst werden, um die Leistung zu optimieren.

3.4 Praktische Anwendungsszenarien

  • Verwenden Sie Hash_File () : Wenn die verarbeiteten Dateien klein sind und der Systemspeicher ausreicht, ist Hash_File () prägnanter und effizienter.

  • Verwenden Sie Hash_Update_Stream () : Wenn die verarbeitete Datei sehr groß ist oder in einer von Speicher begrenzten Umgebung eher geeignet ist, ist Hash_Update_Stream () besser geeignet, da sie die Speicherverwendung durch ein Chunked-Lesen reduzieren kann.

4. Leistungstests

Um die Leistungsunterschiede zwischen den beiden weiter zu überprüfen, können wir sie mit einem einfachen Code -Stück testen.

4.1 Test mit Hash_File ()

 $start = microtime(true);
$hash = hash_file('sha256', 'largefile.txt');
$end = microtime(true);
echo "hash_file took: " . ($end - $start) . " seconds.\n";

4.2 Tests mit Hash_Update_Stream ()

 $start = microtime(true);
$hashContext = hash_init('sha256');
$handle = fopen('largefile.txt', 'rb');
while (!feof($handle)) {
    $data = fread($handle, 8192);
    hash_update_stream($hashContext, $data);
}
$hash = hash_final($hashContext);
fclose($handle);
$end = microtime(true);
echo "hash_update_stream took: " . ($end - $start) . " seconds.\n";

Durch den Vergleich der Ausführungszeit der beiden Codestücke können wir die Leistungsunterschiede zwischen den beiden Methoden in den tatsächlichen Szenarien intuitiv verstehen.

5. Zusammenfassung

  • Für kleine und mittelgroße Dateien ist Hash_File () einfach und einfach zu bedienen, schneller und ausreicht, um die meisten Anforderungen zu erfüllen.

  • Für große Dateien bietet Hash_Update_Stream () eine bessere Speicherregelung und eignet sich für die Verwendung in Speicherbeschränkungsumgebungen.

Die Auswahl der richtigen Hashing -Methode kann nicht nur die Leistung verbessern, sondern auch Ressourcenverschwendung vermeiden. Für eine große Dateiverarbeitung wird empfohlen, Hash_Update_Stream () zu verwenden, da es einen niedrigeren Speicherausdruck und eine stabilere Leistung aufweist.