PHPでハッシュ操作を処理する場合、機能のセットはhash_init() 、 hash_update() 、およびhash_final()のセットは非常に強力な組み合わせです。それらは、大きなファイルまたはチャンクされたデータを処理するのに適したハッシュ値を計算するためのストリーミング(セグメント化された)方法を提供し、一度にhash()関数を使用するよりも効率的です。
この記事では、 hash_update()とhash_final()を正しく使用する方法を詳細に説明し、注意すべきことを指摘します。
これら3つの関数の基本的なプロセスは次のとおりです。
ハッシュコンテキストの初期化:
$context = hash_init('sha256');
データを複数回更新しました:
hash_update($context, 'データの一部1');
hash_update($context, 'データの一部2');
最終的なハッシュ値を取得します:
$hash = hash_final($context);
完全な例:
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello ');
hash_update($context, 'World!');
$finalHash = hash_final($context);
echo "最終的なハッシュ値: " . $finalHash;
?>
1 ?? hash_final()が呼び出された後、コンテキストを再度使用できません
あなたが電話するとき:
$hash = hash_final($context);
コンテキスト$コンテキストが破壊され、 Hash_update()またはhash_final()の呼び出しを続けるために使用することはできません。そうしないと、エラーが報告されます。
同じデータストリームで他のハッシュをカウントし続けたい場合は、 hash_init()を再度呼び出す必要があります。
2 ?? hash_copy()をブランチとして使用します
同じコンテキストに基づいて複数のブランチ結果を取得する必要がある場合は、 hash_copy()を使用できます。
$context = hash_init('sha256');
hash_update($context, 'データの一部');
$copy = hash_copy($context);
hash_update($context, 'その後A');
$hashA = hash_final($context);
hash_update($copy, 'その後B');
$hashB = hash_final($copy);
このようにして、 $ hashaと$ hashbは異なるブランチの結果です。
3 ??大きなファイルを処理するときにブロックごとに更新します
大きなファイルの場合、チャンクでhash_update()を読み取って呼び出すことができます。
<?php
$context = hash_init('sha256');
$handle = fopen('largefile.bin', 'rb');
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "大きなファイルハッシュ値: " . $finalHash;
?>
これにより、一度にファイルを読み取ることによって引き起こされるメモリ圧力が回避されます。
4 ?? URLシナリオで使用します
たとえば、HTTPリクエストを介してデータをストリーミングしている場合:
<?php
$url = 'https://gitbox.net/sample-file.bin';
$context = hash_init('sha256');
$handle = fopen($url, 'rb');
if ($handle) {
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "リモートファイルハッシュ値: " . $finalHash;
} else {
echo "開くことができません URL。";
}
?>
注意してください: php.iniでAllow_url_fopenが有効になっていることを確認してください。そうしないと、 fopen()がURLを直接開くことができません。
5 ??適切なアルゴリズムを選択します
hash_init()の最初のパラメーターはアルゴリズム名です。後者はもはや安全ではないため、古いMD5やSHA1の代わりにSHA256やSHA512などの最新のアルゴリズムを使用することをお勧めします。