In PHP ist Hash_Final () eine Funktion, mit der kontextbasierte Hash-Operationen ausgeführt werden, die normalerweise mit Hash_init () und Hash_Update () verwendet werden. Seine Funktion besteht darin, den endgültigen Hash -Wert zu generieren, nachdem der Datenstrom -Hashing abgeschlossen ist. Da das aufrufende Methode und das Nutzungsszenario relativ komplex sind, stoßen Entwickler bei der Verwendung häufig auf Fehler. In diesem Artikel werden mehrere häufige Fehler und Lösungen für Hash_Final () eingeführt.
$context = hash_init('sha256');
hash_update($context, 'example data');
echo hash_final($context);
echo hash_final($context); // Fehler!
Fehlerursache : Nachdem der Hash_Final () aufgerufen wurde, wurde der Hash -Kontext geschlossen und kann nicht erneut aufgerufen werden. Der Versuch, diesen Kontext erneut zu verwenden, macht einen Fehler.
Lösung : Wenn Sie das Hash -Ergebnis mehrmals erhalten müssen, sollten Sie zuerst den Kontext kopieren:
$context = hash_init('sha256');
hash_update($context, 'example data');
$context_copy = hash_copy($context);
echo hash_final($context); // Erstgebrauch
echo hash_final($context_copy); // Verwenden Sie den Kopierkontext
$context = hash_init('md5');
// Ein Zwischencode...
echo hash_final($wrong_context); // Fehler变量
Fehlerursache : Es wurde eine falsche oder nicht initialisierte Kontextvariable verwendet.
Lösung : Stellen Sie sicher, dass die in Hash_Final () übergebene Variable von Hash_init () zurückgegeben wird und nicht überschrieben oder falsch informiert wird.
$context = hash_init('sha1');
echo hash_final($context);
hash_update($context, 'some data'); // ungültig
Fehlerursache : Sobald Hash_Final () aufgerufen wird, kann der Kontext -Lebenszyklus endet und Hash_Update () nicht mehr verwendet werden.
Lösung : Stellen Sie sicher, dass alle Datenaktualisierungen abgeschlossen sind, bevor Sie Hash_Final () aufrufen.
Hash_Final () fällt auch fehl, wenn es bei der Verarbeitung von externen Daten wie einer API oder einem Formular einen Fehler in Hash_init () oder Hash_Update () gibt.
$context = @hash_init('nonexistent-algo'); // Fehlgeschlagen, aber nicht überprüft
hash_update($context, 'data');
echo hash_final($context); // 会触发警告或Fehler
Lösung : Fügen Sie vor und nach der Verwendung einer Hash_* -Funktion die entsprechende Fehlerprüfung hinzu:
$algo = 'sha256';
if (in_array($algo, hash_algos())) {
$context = hash_init($algo);
hash_update($context, 'data');
echo hash_final($context);
} else {
echo 'Nicht unterstützte Algorithmen';
}
Einige Hashing -Algorithmen sind in einigen PHP -Versionen oder Serverkonfigurationen möglicherweise nicht verfügbar.
Lösung : Überprüfen Sie immer die unterstützte Liste der Algorithmen mithash_algos () und vermeiden Sie hartcodierte Werte, die möglicherweise nicht kompatibel sind. Es kann ebenfalls erforderlich sein, PHP -Versionen oder -verlängerungen zu aktualisieren.
Wenn wir beispielsweise große Datei -Uploads verarbeiten, können wir die Daten in den Stücken lesen und einen Hash generieren, um die Integrität zu überprüfen:
$context = hash_init('sha256');
$handle = fopen('/path/to/largefile.zip', 'rb');
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$hash = hash_final($context);
file_put_contents('https://gitbox.net/hashes.txt', $hash);
In diesem Fall ist die richtige Reihenfolge und die Kontextverarbeitung von entscheidender Bedeutung.