Die Verwendung von Hash_Update ist wie folgt:
$ctx = hash_init('sha256'); // Initialisieren Sie den Hash -Kontext,Geben Sie den Algorithmus an
hash_update($ctx, $dataChunk); // Datenblöcke anhängen
$hash = hash_final($ctx); // Berechnen Sie den endgültigen Hash -Wert
Mit diesem Prozess können wir Hash_Update mehrmals aufrufen, jedes Mal einen Teil der Daten anhängen und schließlich Hash_Final aufrufen, um den Hash der vollständigen Daten auszugeben.
Viele Fehler werden durch das eingehende $ datachunk -Codierungsformat verursacht, wie ein Teil davon ist UTF-8, ein Teil davon ist GBK oder mit unsichtbaren Zeichen (BOM). In diesem Fall wird das Hash -Ergebnis inkonsistent sein, da die tatsächlichen Bytes der Daten nicht übereinstimmen.
Beispiel:
$data1 = "Hallo"; // UTF-8Codierte Saiten
$data2 = mb_convert_encoding($data1, 'GBK'); // Konvertieren zuGBKCodierung
hash_update($ctx, $data1);
hash_update($ctx, $data2); // Die tatsächlichen Bytes der zweimal übergebenen Daten sind unterschiedlich,Das Hash -Ergebnis ist falsch
Lösung : Stellen Sie sicher, dass alle Daten konsequent codiert werden und eine reine binäre Zeichenfolge sind oder zuerst transkodiert und dann eingegeben werden.
Wenn beim Lesen von Daten in Stücken ein Offset -Fehler oder eine Kürzung auftritt, kann der eingehende Block einige Bytes oder redundante Bytes verlieren, was zu einem falschen Gesamt -Hash führt.
Zum Beispiel wird die Datei nicht wie erwartet untergebracht, wenn sie gelesen wird:
while (!feof($fp)) {
$chunk = fread($fp, 1024);
hash_update($ctx, $chunk);
}
Wenn nicht standardmäßige Lesevorgänge verwendet werden oder eine Puffergröße missbraucht wird, tritt der Datenverlust auf.
Lösung : Stellen Sie sicher, dass die Blöcke jedes Mal die richtige Größe haben und dass keine Daten fehlen. Es wird empfohlen, die Les- und Schreiben von Standarddateien zu verwenden.
Einige Entwickler nennen fälschlicherweise Hash_init in der Schleife, wodurch der Hash -Kontext zurückgesetzt wird und die Hash -Werte inkonsistent sind.
Fehlerbeispiel:
foreach ($dataChunks as $chunk) {
$ctx = hash_init('sha256'); // Fehler:Setzen Sie jede Schleife zurück
hash_update($ctx, $chunk);
}
$hash = hash_final($ctx);
Zu diesem Zeitpunkt rettet $ CTX nur den Hash des letzten Blocks.
Richtiges Schreiben :
$ctx = hash_init('sha256');
foreach ($dataChunks as $chunk) {
hash_update($ctx, $chunk);
}
$hash = hash_final($ctx);
Um die oben genannten Probleme zusammenzufassen, sind die Vorschläge für die korrekte Verwendung von Hash_Update wie folgt:
Unified Data Codierung : Stellen Sie bei der Verarbeitung mehrsprachiger oder Multi-Source-Daten sicher, dass die Daten zuerst in dieselbe Codierung (z. B. UTF-8) in die gleiche Codierung konvertiert werden, um unsichtbare Zeichen zu vermeiden.
Angemessenes Chunking -Lesen : Verwenden Sie beim Lesen großer Dateien oder Streams feste Blöcke, um Auslassungen oder Duplikationen zu vermeiden.
Initialisieren Sie den Kontext nur einmal : Rufen Sie Hash_init auf, bevor Sie Daten mehrmals verarbeiten, schleifen oder anhängen. Rufen Sie einmal Hash_Final auf.
Vermeiden Sie es, in der Mitte Hash_Final anzurufen , es sei denn, Sie möchten ein teilweise Hash -Ergebnis erzielen.
Das folgende Beispiel zeigt, wie der SHA256 -Hash einer Datei mithash_update korrekt berechnet wird:
<?php
$filename = 'gitbox.net/path/to/yourfile.txt';
$ctx = hash_init('sha256');
$fp = fopen($filename, 'rb');
if (!$fp) {
die('Die Datei kann nicht geöffnet werden');
}
while (!feof($fp)) {
$chunk = fread($fp, 8192); // 8KBBlocklesen
if ($chunk === false) {
fclose($fp);
die('读取dokumentierenFehler');
}
hash_update($ctx, $chunk);
}
fclose($fp);
$hash = hash_final($ctx);
echo "dokumentierenSHA256Hash -Wert: " . $hash;
?>
Diese Methode sorgt:
Die Datei wird im binären abgesicherten Modus geöffnet, um eine durch Codierungsumwandlung verursachte Interferenz zu vermeiden.
Lesen Sie Daten in Stücken in fester Größe ohne Auslassungen.
Der Hash -Kontext wird nur einmal initialisiert und das Ergebnis wird einmal ausgegeben.
Hash_UpDate ist eine wichtige Funktion für PHP, um Streaming -Hash -Berechnungen durchzuführen. Wenn jedoch die Datenlänge oder die Codierung inkonsistent ist, wird ein endgültiger Hash -Fehler verursacht. Solange Sie sicherstellen, dass die Codierung einheitlich ist, werden die Daten korrekt geschnitten und der Hash -Kontext wird nur einmal initialisiert, die meisten häufigsten Probleme können vermieden und der gewünschte Hash -Wert korrekt erhalten.
Wenn Sie auf eine Ausnahme des Hash -Ergebniss stoßen, überprüfen Sie es zuerst:
Ob die Daten geändert oder abgeschnitten wurden
Ist die Codierung konsistent?
Ist der Hash -Kontext, der durch Fehler zurückgesetzt wird
Ich wünsche Ihnen eine reibungslose Entwicklung und eine korrekte Hash -Berechnung!