hash_updateの使用は次のとおりです。
$ctx = hash_init('sha256'); // ハッシュコンテキストを初期化します,アルゴリズムを指定します
hash_update($ctx, $dataChunk); // データブロックを追加します
$hash = hash_final($ctx); // 最終的なハッシュ値を計算します
このプロセスにより、 Hash_Updateを複数回呼び出し、毎回データの一部を追加し、最後にHash_Finalを呼び出して完全なデータのハッシュを出力できます。
多くのエラーは、その一部はUTF-8、その一部はGBK、または目に見えない文字(BOM)など、着信$ Datachunkエンコード形式によって引き起こされます。この場合、データの実際のバイトが一致していないため、ハッシュ結果は一貫性がありません。
例:
$data1 = "こんにちは"; // UTF-8エンコードされた文字列
$data2 = mb_convert_encoding($data1, 'GBK'); // に変換しますGBKコーディング
hash_update($ctx, $data1);
hash_update($ctx, $data2); // 2回渡されたデータの実際のバイトは異なります,ハッシュの結果は正しくありません
解決策:すべてのデータが一貫してエンコードされ、純粋なバイナリ文字列であるか、最初にトランスコードされてから渡されていることを確認してください。
チャンクでデータを読み取るときにオフセットエラーまたは切り捨てが発生すると、着信ブロックがバイトまたは冗長なバイトを失い、全体的なハッシュが誤っている可能性があります。
たとえば、ファイルが読み取られたときに予想どおりにチャンクされていません。
while (!feof($fp)) {
$chunk = fread($fp, 1024);
hash_update($ctx, $chunk);
}
標準以外の読み取りが使用されている場合、またはバッファサイズが誤用されると、データの損失が発生します。
解決策:毎回読み取られるブロックが正しいサイズであり、データがないことを確認してください。標準のファイルの読み取りプロセスを使用することをお勧めします。
一部の開発者は、誤ってループ内のhash_initを呼び出して、ハッシュコンテキストをリセットし、ハッシュ値を一貫していません。
エラー例:
foreach ($dataChunks as $chunk) {
$ctx = hash_init('sha256'); // 間違い:すべてのループをリセットします
hash_update($ctx, $chunk);
}
$hash = hash_final($ctx);
この時点で、 $ CTXは最後のブロックのハッシュを保存します。
正しい書き込み:
$ctx = hash_init('sha256');
foreach ($dataChunks as $chunk) {
hash_update($ctx, $chunk);
}
$hash = hash_final($ctx);
上記の問題を要約するために、 hash_updateを正しく使用するための提案は次のとおりです。
統一されたデータエンコーディング:多言語またはマルチソースデータを処理する場合、目に見えない文字を避けるために、最初に同じエンコード(UTF-8など)にデータを変換してください。
合理的なチャンキングリーディング:大きなファイルやストリームを読むときは、固定ブロックを使用して省略や複製を避けます。
コンテキストを1回だけ初期化します。データの処理を開始する前に、 Hash_initを呼び出し、データを複数回ループ、または追加して、 Hash_finalを1回呼び出します。
部分的なハッシュ結果を取得したい場合を除き、中央でHash_finalを呼び出すことは避けてください。
次の例は、 hash_updateを使用してファイルのSHA256ハッシュを正しく計算する方法を示しています。
<?php
$filename = 'gitbox.net/path/to/yourfile.txt';
$ctx = hash_init('sha256');
$fp = fopen($filename, 'rb');
if (!$fp) {
die('ファイルを開くことができません');
}
while (!feof($fp)) {
$chunk = fread($fp, 8192); // 8KBブロックリーディング
if ($chunk === false) {
fclose($fp);
die('读取書類間違い');
}
hash_update($ctx, $chunk);
}
fclose($fp);
$hash = hash_final($ctx);
echo "書類SHA256ハッシュ値: " . $hash;
?>
この方法は次のことを保証します。
ファイルは、変換のエンコードによる干渉を避けるために、バイナリセーフモードで開かれます。
省略なしに、固定サイズのチャンクでデータを読み取ります。
ハッシュコンテキストは一度だけ初期化され、結果は1回出力されます。
Hash_updateは、PHPがストリーミングハッシュ計算を実行するための重要な機能ですが、データの長さまたはエンコーディングが一貫性がない場合、最終的なハッシュエラーが発生します。エンコーディングが均一であることを確認する限り、データは正しく充電され、ハッシュコンテキストは一度だけ初期化され、最も一般的な問題は回避でき、望ましいハッシュ値が正しく取得されます。
ハッシュ結果の例外が発生した場合は、最初に確認してください。
データが変更されているか、切り捨てられているか
エンコーディングは一貫していますか?
ハッシュコンテキストはエラーによってリセットされています
スムーズな開発と正しいハッシュ計算をお祈りします!