現在の位置: ホーム> 最新記事一覧> hash_update_stream()を使用して、ファイル重複排除関数を実装します

hash_update_stream()を使用して、ファイル重複排除関数を実装します

M66 2025-05-18

ファイル重複排除は、データ処理の非常に重要な部分です。特に、多数のファイルを処理する必要がある場合、重複ファイルを削除するとストレージスペースを節約し、システム効率を向上させることができます。 PHPは非常に強力な機能HASH_UPDATE_STREAM()を提供します。これは、ファイル重複排除中にハッシュ計算をより効率的に実行するのに役立ちます。この記事では、HASH_UPDATE_STREAM()関数を使用して効率的なファイル重複排除関数を実現する方法を詳細に紹介します。

1。hash_update_stream ()関数は何ですか?

Hash_update_stream()は、PHPの組み込みハッシュ関数の1つです。ファイルのコンテンツを徐々に読み取り、ハッシュ値を計算することにより、ファイルをメモリにロードせずに大きなファイルを処理できます。大規模なデータファイルのハッシュ計算に適しており、ハッシュ値をリアルタイムで更新できます。

その関数の署名は次のとおりです。

 bool hash_update_stream ( resource $context , resource $file , int $length = 8192 )
  • $コンテキストhash_init()によって作成されたハッシュコンテキスト。

  • $ファイル:ハッシュ値を計算するファイルリソース。

  • $ length :ファイルごとのバイト数を読み取り、デフォルトは8192バイトです。

2。hash_update_stream ()を使用して、ファイル重複排除を実現します

ファイル重複排除の場合、通常、各ファイルのハッシュ値を計算し、ハッシュ値がすでに存在するかどうかを判断する必要があります。ハッシュ値が既に存在する場合、ファイルが複製されていることを意味し、削除できます。

hash_update_stream()を介して、メモリをあまり消費せずに大きなファイルで段階的なハッシュ計算を効果的に実行することができ、それにより重複の効率が向上します。

3。実装手順

Hash_update_stream()を使用してファイルのハッシュ計算を処理するファイル重複排除の簡単なPHP例を次に示します。

 <?php

// ハッシュアルゴリズムのセットアップ
$hash_algorithm = 'sha256';

// フォルダを延期するパスを取得します
$directory = '/path/to/your/files';

// ハッシュされた値を保存する配列を作成します
$hashes = [];

// ディレクトリ内のすべてのファイルを取得します
$files = scandir($directory);

foreach ($files as $file) {
    $file_path = $directory . DIRECTORY_SEPARATOR . $file;

    // 飛び越える '.' そして '..'
    if ($file === '.' || $file === '..') {
        continue;
    }

    // ハッシュコンテキストを初期化します
    $context = hash_init($hash_algorithm);

    // ファイルを開きます
    $file_resource = fopen($file_path, 'rb');
    if ($file_resource) {
        // ハッシュ値を徐々に更新します
        while (!feof($file_resource)) {
            hash_update_stream($context, $file_resource, 8192);
        }

        // ファイルリソースを閉じます
        fclose($file_resource);

        // ファイルの最終的なハッシュ値を取得します
        $hash = hash_final($context);

        // ハッシュ値が既に存在するかどうかを確認してください
        if (in_array($hash, $hashes)) {
            // ファイルが繰り返されている場合,削除します
            unlink($file_path);
            echo "複製ファイルを削除します: $file\n";
        } else {
            // さもないと,既存のハッシュアレイにハッシュ値を追加します
            $hashes[] = $hash;
        }
    } else {
        echo "无法ファイルを開きます: $file\n";
    }
}

echo "ファイル重複排除が完了しました!\n";

?>

4。コード解析

  1. フォルダー内のすべてのファイルを取得します。まず、 Scandir()関数を使用して、ディレクトリ内のすべてのファイルを取得します。スキップしたいことに注意してくださいおよび..フォルダー。

  2. ハッシュ値を段階的に計算します。各ファイルについて、ハッシュコンテキストが最初に初期化され、次にファイルが段階的に読み取り、 hash_update_stream()を使用してハッシュ値を更新します。

  3. 重複排除の判断:計算されたハッシュ値アレイ$ハッシュを保存することにより、現在のファイルのハッシュ値がすでに存在するかどうかを判断します。存在する場合、ファイルが繰り返され、ファイルが直接削除されることを意味します。それ以外の場合は、ハッシュ値を配列に追加し、次のファイルの処理を続けます。

5。最適化と予防策

  • メモリの最適化hash_update_stream()関数を使用すると、ファイル全体をメモリにロードすることを避けて、大きなファイルを処理できます。

  • 同時重複排除:多数のファイルについて、マルチスレッドまたはバッチ処理を使用して、重複排除速度をさらに高めることができます。 PHPはネイティブにマルチスレッドをサポートしていませんが、 pthreadsなどの拡張機能を使用して、または複数のプロセスにタスクを配布することで達成できます。

  • ハッシュ衝突:ハッシュ衝突の可能性は非常に低いですが、極端な場合、2つのファイルのハッシュ値が同じであるが内容が異なる場合、それはまだファイルの複製と誤解されます。したがって、十分に強い( SHA256など)ハッシュアルゴリズムを選択すると、このリスクを大幅に減らすことができます。

6。結論

hash_update_stream()関数を使用して、特に大きなファイルを処理する場合は、ファイル重複排除操作を非常に効率的に実装できます。単純なハッシュバリュー判断により、複製ファイルを簡単に削除し、ストレージスペースを保存し、システムのパフォーマンスを向上させることができます。

この記事が、hash_update_stream()をよりよく理解し、使用してファイル重複排除関数を実装するのに役立つことを願っています。ご質問がある場合は、コメント領域にメッセージを残してください。