In PHP wird die Funktion von Hash_Final verwendet, um den letzten Schritt eines Hash -Kontextes (erstellt durch Hash_init ) und den berechneten Hash -Wert zurückzugeben. Es gehört zur Hash -Erweiterung von PHP und wird normalerweise mit Hash_init , Hash_Update , Hash_Update_Stream und Hash_Update_file verwendet.
Wenn wir also Hash_Final verwenden, um die Hash -Werte zu berechnen, wie werden unterschiedliche Datenformate (wie Zeichenfolgen, Binärdaten, Dateiströme usw.) behandelt? Dieser Artikel wird ausführlich erörtert.
Schauen wir uns zuerst ein grundlegendes Beispiel an:
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello World');
$hash = hash_final($context);
echo $hash;
?>
Dieser Code-Snippet gibt den SHA-256-Hash-Wert der String Hello World (in Hexadezimal) aus.
Beachten:
Der zweite Parameter, der von Hash_Update empfangen wird, ist eine Zeichenfolge.
Egal welcher Typ Sie bereitstellen (solange es in eine Zeichenfolge konvertiert werden kann), wird es schließlich als Byte -Sequenz verarbeitet.
Wenn Sie in einer String (ob ASCII oder UTF-8-Codierung) übergeben, verarbeitet PHP sie direkt in Byte-Sequenzen.
Zum Beispiel:
hash_update($context, "abc"); // Was ist mit dem Umgang mit '61 62 63' Drei Bytes
Hinweis: Multi-Byte-Zeichen (wie Chinesen) werden auch berechnet, indem Hash nach ihrer zugrunde liegenden Byte-Sequenz und nicht an der "Charakter" -Droschenheit eingeben.
Wenn Sie beispielsweise Binärdaten übergeben, wird ein binärer Stream, der über File_Get_Contents erhalten wird, auch direkt von Bytes gespeist:
$data = file_get_contents('https://gitbox.net/image.png');
hash_update($context, $data);
Die $ -Daten hier können \ 0 (Null -Byte), hohes Byte usw. enthalten. PHP führt keine Filterung oder Flucht durch und tritt in die Hash -Berechnung ein, wie sie ist.
Wenn Sie Hash für große Dateien berechnen möchten, wird empfohlen, Hash_Update_Stream zu verwenden:
$fp = fopen('https://gitbox.net/largefile.zip', 'rb');
$context = hash_init('sha256');
hash_update_stream($context, $fp);
$hash = hash_final($context);
fclose($fp);
Hier wird der Dateiinhalt in Stücken gelesen und in den Hash -Kontext eingespeist, um zu vermeiden, dass die gesamte Datei gleichzeitig in den Speicher geladen wird.
Wenn Sie Hash in einer Datei direkt berechnen möchten, können Sie Hash_file verwenden. Wenn Sie jedoch die Hash_* -Function -Familie verwenden möchten, benötigen Sie:
$context = hash_init('sha256');
hash_update_file($context, 'https://gitbox.net/document.pdf');
$hash = hash_final($context);
Hash_update_file öffnet automatisch die Datei, liest ihren Inhalt und aktualisiert den Kontext.
Hash_Final beendet nur die akkumulierten Daten.
Bevor die Daten in den Kontext ( Hash_Update , Hash_Update_Stream , Hash_Update_file ) eingeben, wurde in Byte -Sequenzen gelesen und kümmert sich nicht um den ursprünglichen "Datentyp".
Sie müssen sicherstellen, dass die Daten, die Sie übergeben, das sind, was Sie haben möchten (insbesondere Codierung oder binäre Sicherheitsprobleme).