現在の位置: ホーム> 最新記事一覧> Hash_updateでphp hash_finalを使用する場合の注意

Hash_updateでphp hash_finalを使用する場合の注意

gitbox 2025-05-20

PHPでハッシュ操作を処理する場合、機能のセットはhash_init()hash_update() 、およびhash_final()のセットは非常に強力な組み合わせです。それらは、大きなファイルまたはチャンクされたデータを処理するのに適したハッシュ値を計算するためのストリーミング(セグメント化された)方法を提供し、一度にhash()関数を使用するよりも効率的です。

この記事では、 hash_update()hash_final()を正しく使用する方法を詳細に説明し、注意すべきことを指摘します。

基本的な使用法

これら3つの関数の基本的なプロセスは次のとおりです。

  1. ハッシュコンテキストの初期化:

     $context = hash_init('sha256');
    
  2. データを複数回更新しました:

     hash_update($context, 'データの一部1');
    hash_update($context, 'データの一部2');
    
  3. 最終的なハッシュ値を取得します:

     $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.iniAllow_url_fopenが有効になっていることを確認してください。そうしないと、 fopen()がURLを直接開くことができません。

5 ??適切なアルゴリズムを選択します

hash_init()の最初のパラメーターはアルゴリズム名です。後者はもはや安全ではないため、古いMD5SHA1の代わりにSHA256SHA512などの最新のアルゴリズムを使用することをお勧めします。