現在の位置: ホーム> 最新記事一覧> hash_update_stream()を使用してファイルを増分する方法

hash_update_stream()を使用してファイルを増分する方法

M66 2025-05-31

大きなファイルを処理する場合、ハッシュ計算のためにファイル全体を直接読み取ると、多くのメモリが得られ、メモリが不十分になる可能性があります。大規模なファイルを効率的に処理するために、PHPはhash_update_stream()関数を提供します。これにより、大きなファイルを増分することができます。このようにして、ファイルの読み取り中にハッシュ値を計算して、ファイル全体を一度にメモリにロードすることを避けることができます。

hash_update_stream()関数とは何ですか?

hash_update_stream()は、phpの関数であり、ストリームデータのハッシュ値を段階的に更新します。 hash_update()に似ていますが、違いは、ストリングデータを直接処理するのではなく、入力としてストリームリソースを受け入れることです。これにより、メモリに一度にロードすることなく、大量のデータを処理できます。

hash_update_stream()関数を使用する方法は?

hash_update_stream()関数を使用する場合、最初にファイルストリームを開き、ファイルのハッシュコンテキストを作成する必要があります。その後、ファイルのコンテンツの一部をストリーミングして、ハッシュ値を徐々に更新できます。

hash_update_stream()を使用して、大きなファイルをインクリメンタルハッシュするための基本的な手順は次のとおりです。

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

    まず、 hash_init()関数を使用して、ハッシュコンテキストを初期化します。 SHA256MD5などのサポートされているハッシュアルゴリズムを選択できます。

     $hash_algorithm = 'sha256';  // ハッシュアルゴリズムを選択します
    $context = hash_init($hash_algorithm);
    
  2. ファイルストリームを開きます:

    FOPEN()関数を使用してファイルを開き、ファイルストリームを取得します。

     $file_path = 'path_to_large_file.txt';  // 大きなファイルパスに置き換えます
    $file_stream = fopen($file_path, 'rb');
    if (!$file_stream) {
        die("ファイルを開くことができません!");
    }
    
  3. ハッシュを増分する:

    hash_update_stream()関数を使用して、ファイルストリームのデータを処理します。ファイルの内容をバッチで読み取り、ハッシュ値を更新できます。

     while (!feof($file_stream)) {
        $data = fread($file_stream, 8192);  // それぞれ読みます8KBデータ
        hash_update_stream($context, $data);
    }
    
  4. 最終的なハッシュ値を取得します:

    ファイルを読んだ後、 hash_final()関数を使用して最終的なハッシュ値を取得します。

     $final_hash = hash_final($context);
    echo "ファイルのハッシュ値はです: " . $final_hash . PHP_EOL;
    
  5. ファイルストリームを閉じます:

    最後に、ファイルストリームを閉じることを忘れないでください。

     fclose($file_stream);
    

完全なサンプルコード

<?php

// ハッシュアルゴリズムを選択します
$hash_algorithm = 'sha256';
$context = hash_init($hash_algorithm);

// ファイルストリームを開きます
$file_path = 'path_to_large_file.txt';  // 大きなファイルパスに置き換えます
$file_stream = fopen($file_path, 'rb');
if (!$file_stream) {
    die("ファイルを開くことができません!");
}

// 増分更新ハッシュ値
while (!feof($file_stream)) {
    $data = fread($file_stream, 8192);  // それぞれ読みます8KBデータ
    hash_update_stream($context, $data);
}

// 最終的なハッシュ値を取得します
$final_hash = hash_final($context);
echo "ファイルのハッシュ値はです: " . $final_hash . PHP_EOL;

// ファイルストリームを閉じます
fclose($file_stream);

?>

注意すべきこと

  1. メモリ効率: Hash_update_stream()関数を使用して大きなファイルを処理する場合、ファイル全体をメモリにロードしないため、多くのメモリを保存できますが、ブロックごとにファイルを読み取り、ハッシュ値を徐々に更新できます。

  2. ファイルのサイズ読み取りブロック:読み取りブロックのサイズ( Fread()の2番目のパラメーター)は、実際の状況に従って調整できます。一般的に、8kb〜64kbは、ファイルのサイズとハードウェアの条件に基づいて最適化できる妥当な範囲です。

  3. エラー処理:実際のアプリケーションでは、ファイルの開きや読み取りの障害など、ファイルの読み取りエラーの処理に注意する必要があります。

要約します

hash_update_stream()関数は、大きなファイルのハッシュ計算を処理するための非常に実用的なツールです。これは、ハッシュ値をストリーミングで段階的に計算し、ファイル全体を一度にメモリにロードする問題を回避するのに役立ちます。妥当なブロックサイズと増分更新により、大きなファイルのハッシュを効率的に計算して、さまざまなメモリ制限環境に適応できます。