Bei der Verarbeitung von Hash -Operationen in PHP sind die Funktionen von Hash_init () , Hash_Update () und Hash_Final () eine sehr leistungsstarke Kombination. Sie bieten eine (segmentierte) Streaming -Methode zur Berechnung von Hash -Werten, die für die Verarbeitung großer Dateien oder Chunked -Daten geeignet sind und effizienter sind als die Verwendung der Hash () -Funktion gleichzeitig.
In diesem Artikel wird detailliert erklärt, wie man Hash_Update () und Hash_Final () richtig verwendet und auf die Dinge hinweist, auf die die Dinge beachtet werden sollen.
Der Grundprozess dieser drei Funktionen lautet wie folgt:
Initialisieren Sie den Hash -Kontext:
$context = hash_init('sha256');
Daten mehrmals aktualisiert:
hash_update($context, 'Teil der Daten1');
hash_update($context, 'Teil der Daten2');
Holen Sie sich den endgültigen Hash -Wert:
$hash = hash_final($context);
Vollständiges Beispiel:
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello ');
hash_update($context, 'World!');
$finalHash = hash_final($context);
echo "Endgültiger Hash -Wert: " . $finalHash;
?>
1 ?? Der Kontext kann nicht erneut verwendet werden, nachdem Hash_Final () aufgerufen wurde
Wenn Sie anrufen:
$hash = hash_final($context);
Der Kontext $ $ context wird zerstört , und Sie können ihn nicht mehr verwenden, um weiterhin Hash_Update () oder Hash_FINAL () aufzurufen, andernfalls wird ein Fehler gemeldet.
Wenn Sie weiterhin andere Hashes im selben Datenstrom zählen möchten, müssen Sie Hash_init () erneut aufrufen.
2 ?? Verwenden Sie Hash_Copy () als Zweig
Wenn Sie mehrere Filialenergebnisse basierend auf demselben Kontext erhalten müssen, können Sie Hash_Copy () verwenden:
$context = hash_init('sha256');
hash_update($context, 'Teil der Daten');
$copy = hash_copy($context);
hash_update($context, 'NachfolgendA');
$hashA = hash_final($context);
hash_update($copy, 'NachfolgendB');
$hashB = hash_final($copy);
Auf diese Weise sind $ hashha und $ hashb die Ergebnisse verschiedener Zweige.
3 ?? Aktualisieren Sie nach Block bei der Bearbeitung großer Dateien
Für große Dateien können Sie Hash_Update () in Stücken lesen und aufrufen:
<?php
$context = hash_init('sha256');
$handle = fopen('largefile.bin', 'rb');
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "Großer Datei -Hash -Wert: " . $finalHash;
?>
Dies vermeidet den Speicherdruck, der durch das Lesen von Dateien gleichzeitig verursacht wird.
4 ?? Verwendung in URL -Szenarien
Wenn Sie Daten über die HTTP -Anforderung streamen, z. B.:
<?php
$url = 'https://gitbox.net/sample-file.bin';
$context = hash_init('sha256');
$handle = fopen($url, 'rb');
if ($handle) {
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "Remotedatei -Hash -Wert: " . $finalHash;
} else {
echo "Nicht öffnen können URL。";
}
?>
Seien Sie vorsichtig: Stellen Sie sicher, dass Degly_url_fopen in php.ini aktiviert ist, ansonsten kann fopen () die URL nicht direkt öffnen.
5 ?? Wählen Sie den richtigen Algorithmus
Der erste Parameter von Hash_init () ist der Algorithmus -Name. Es wird empfohlen, moderne Algorithmen wie SHA256 und SHA512 anstelle von alten MD5 oder SHA1 zu verwenden, da dieser nicht mehr sicher ist.