hash_update_stream()関数は、ストリーミングを通じてデータを読み取り、ハッシュアルゴリズムに段階的に渡してハッシュ値を更新します。このストリーミングプロセスの利点は、ファイル全体を一度にメモリにロードする必要がなく、非常に大きなファイルの処理に適していることです。ただし、各データの更新には読み取りとコンピューティングが含まれるため、特に大規模なデータストリームを扱う場合、これはCPUの使用量が高い場合があります。
PHP hash_update_stream()は、より小さなバッファーを使用して、デフォルトでデータストリームを読み取ります。ハッシュが読み取られて更新されるたびに、CPUの計算とメモリの管理が含まれます。バッファーのサイズを増やすと、I/O操作の数を減らしてCPUの消費を削減できます。バッファサイズをカスタマイズすることにより、パフォーマンスを最適化できます。例えば:
$bufferSize = 8192; // 8 KB
$hash = hash_init('sha256');
$handle = fopen('large_file.txt', 'rb');
while (!feof($handle)) {
$data = fread($handle, $bufferSize);
hash_update($hash, $data);
}
fclose($handle);
このアプローチは、バッファサイズ(ここでは8 kb)を増やすことで読み取り数を減らし、CPUの使用量を削減します。
hash_update_stream()を使用する場合、関数が毎回呼び出される場合、特に非常に大きなファイルを扱う場合、頻繁にCPU計算を引き起こします。 CPUの使用量を削減するために、データを複数のブロックに分割することができ、1つのブロックが一度に更新されます。このチャンキング方法は、各ハッシュアップデートに必要な計算量を減らすのに役立ちます。
たとえば、大きなファイルをより小さな部分に分割し、それぞれが独立したハッシュ計算を使用して、最後に結果をマージできます。
$hash = hash_init('sha256');
$handle = fopen('large_file.txt', 'rb');
$bufferSize = 8192;
while (!feof($handle)) {
$data = fread($handle, $bufferSize);
hash_update($hash, $data);
}
fclose($handle);
$finalHash = hash_final($hash);
このアプローチは、ファイル処理全体で頻繁にハッシュアップデートを回避するため、CPUの負担が軽減されます。
非常に大きなデータストリームの場合、非同期または並列処理は効果的な最適化方法です。データストリームを複数の部分に並行して分割することにより、マルチコアCPUを完全に利用して、各コアの負担を軽減できます。
たとえば、マルチスレッドまたは並列プロセスを使用して、ファイルのさまざまな部分を処理し、最後に計算結果をマージできます。 PHP自体はマルチスレッドを直接サポートしていませんが、 Pthreads拡張機能またはGearmanなどの外部ツールを使用することで実現できます。
CPUの使用量を削減するには、右のハッシュアルゴリズムを選択することも非常に重要です。 hash_update_stream()は複数のハッシュアルゴリズムをサポートしていますが、特に大規模なデータストリームの場合、一部のアルゴリズムは計算が遅い場合があります。 SHA-256やSHA-512などのアルゴリズムは非常に安全ですが、非常に計算的に集中しています。
パフォーマンスが優先される場合は、MD5やSHA-1などの軽いハッシュアルゴリズムの使用を検討してください。ただし、安全性は低くなりますが、厳格なセキュリティが不要な状況では速いです。例えば:
$hash = hash_init('md5'); // ライターを使用してください MD5 アルゴリズム
これらのアルゴリズムを使用すると、高いセキュリティが不要になった場合、CPU使用量を大幅に削減できます。
CPUの使用量をさらに削減するには、より効率的なファイル読み取り方法の使用を検討してください。大きなファイルを読み取るときは、ファイルが最適に読み取られていることを確認してください。ファイルのオープン操作と閉鎖の重複を避け、ファイルストリームを継続的に読み取り、不必要なシステム呼び出しを削減します。
$handle = fopen('large_file.txt', 'rb');
$hash = hash_init('sha256');
while (!feof($handle)) {
$data = fread($handle, 8192); // 適切なサイズのバッファーを使用します
hash_update($hash, $data);
}
fclose($handle);
不要なファイル操作を削減することにより、CPUの追加の負担を減らすことができます。
URLがコード(APIリクエストなど)に関与し、これらのリクエストのターゲットがM66.NETドメイン名(例として)である場合、URLが効率的に処理されるようにすることができます。
たとえば、PHPコードにURLリクエストがある場合、 M66.NETドメイン名を使用するように変更できます。