In PHP ist die Funktion Hash_Final ein Tool, mit dem ein inkrementeller Hash -Kontext vervollständigt und der endgültige Hash -Wert zurückgegeben wird. Es wird normalerweise in Verbindung mit Funktionen wie Hash_init , Hash_Update usw. verwendet, um Hash -Berechnungen großer Daten oder Streaming -Daten zu verarbeiten. Viele Entwickler werden jedoch bei Verwendung von Hash_Final auf einige häufige Probleme stoßen. Dieser Artikel wird diese Probleme im Detail analysieren und Lösungen bereitstellen.
Die Definition von Hash_Final lautet wie folgt:
string hash_final ( HashContext $context [, bool $raw_output = FALSE ] )
$ context : Hash -Kontext von Hash_Init erstellt.
$ raw_output : Wenn auf true eingestellt, geben Sie Roh -Binärdaten aus; Andernfalls geben Sie die Hexadezimal -String von Kleinbuchstaben aus.
Einfaches Beispiel:
$context = hash_init('sha256');
hash_update($context, 'hello');
$finalHash = hash_final($context);
echo $finalHash;
Phänomen:
Sobald Hash_Final aufgerufen wird, wird der zugehörige $ -Kontext ungültig. Wenn Sie versuchen, denselben Kontext erneut zu verwenden, zum Beispiel:
$context = hash_init('sha256');
hash_update($context, 'hello');
$final1 = hash_final($context);
$final2 = hash_final($context); // Fehler!
Wird eine Warnung oder einen Fehler verursachen.
Lösung:
Wenn Sie den Kontext wiederverwenden müssen, rufen Sie Hash_Copy vor Hash_final an:
$context = hash_init('sha256');
hash_update($context, 'hello');
$contextCopy = hash_copy($context);
$final1 = hash_final($context);
$final2 = hash_final($contextCopy);
Phänomen:
Viele Leute nehmen nur standardmäßig die String -Ausgabe und ignorieren, dass $ raw_output = true tatsächlich binär zurückgibt. Wenn Sie Echo direkt ausgeben, erhalten Sie einen verstümmelten Code:
$context = hash_init('sha256');
hash_update($context, 'hello');
$final = hash_final($context, true);
echo $final; // Müllcodes können angezeigt werden
Lösung:
Um lesbare Inhalte anzuzeigen, können Sie Bin2hex oder Base64_CODE verwenden:
$final = hash_final($context, true);
echo bin2hex($final);
Phänomen:
Wenn Sie Hash für große Dateien oder Big -Data -Streams verwenden, verbraucht die Verwendung von Hash () direkt viel Speicher:
$hash = hash('sha256', file_get_contents('largefile.dat'));
Lösung:
Verwenden Sie Hash_init + Hash_Update , um zu streamen:
$context = hash_init('sha256');
$handle = fopen('largefile.dat', 'rb');
while (!feof($handle)) {
$data = fread($handle, 8192);
hash_update($context, $data);
}
fclose($handle);
$finalHash = hash_final($context);
Phänomen:
Dieselben Eingabedaten stimmen nicht mit den in PHP in anderen Sprachen berechneten Hash -Werten (wie Python, Node.js) nicht ab.
Lösung:
stellen Sie sicher:
Die Eingangscodierung ist konsistent (UTF-8 gegenüber UTF-16).
Ob es zusätzliche Linienbrüche oder Räume gibt.
Auf die gleiche Weise berechnet (Original -vs -codierter Text).
Beispiel: Berechnen Sie den SHA-256-Hash eines UTF-8-codierten String mit PHP:
$context = hash_init('sha256');
hash_update($context, mb_convert_encoding($input, 'UTF-8'));
$finalHash = hash_final($context);
Phänomen:
Bei der Hash -Überprüfung der URL wird die Normalisierung ignoriert, was zu unterschiedlichen Hashes für dieselbe Adresse führt:
$url1 = 'https://gitbox.net/page';
$url2 = 'https://gitbox.net/page/';
Lösung:
Normalisieren Sie die URL vor der Berechnung, zum Beispiel:
function normalizeUrl($url) {
$parsed = parse_url($url);
$scheme = $parsed['scheme'] ?? 'http';
$host = $parsed['host'] ?? '';
$path = rtrim($parsed['path'] ?? '/', '/');
return "$scheme://$host$path";
}
$context = hash_init('sha256');
hash_update($context, normalizeUrl('https://gitbox.net/page/'));
$finalHash = hash_final($context);