大規模なファイルを使用する場合、ファイル全体を直接読み取り、ハッシュ値を計算すると、メモリが過度に使用され、メモリが不十分な場合にプログラムがクラッシュする可能性があります。この問題を解決するために、PHPのhash_update_stream関数を使用して、チャンクのファイルを読み取り、ハッシュ値をリアルタイムで計算できます。チャンクでファイルを読み取り、ファイルのハッシュ値を計算してファイル全体を一度にロードしないように計算する方法を示す例を次に示します。
HASH_UPDATE_STREAM関数は、ストリーミングの更新のためにPHPが提供する関数です。ハッシュ値。 hash_update()関数とは異なり、 hash_update_streamは、大きなファイルの処理に適したファイルストリーム(リソース)を介してブロックごとにハッシュ値を更新します。
ファイルストリームを開きます。
hash_init関数を使用してハッシュアルゴリズムを初期化します。
hash_update_streamを使用して、チャンクのファイルを読み取り、ハッシュ値をリアルタイムで計算します。
終了したらファイルストリームを閉じて、最終的なハッシュ値を取得します。
<?php
// 初期化ハッシュアルゴリズム,ここで使用しますSHA-256
$hashAlgorithm = 'sha256';
// ファイルストリームを開きます
$filePath = 'path_to_your_large_file'; // ファイルパスに置き換えます
$fileStream = fopen($filePath, 'rb');
if (!$fileStream) {
die("ファイルを開くことができません");
}
// ハッシュ計算を初期化します
$hashContext = hash_init($hashAlgorithm);
// ブロックサイズを設定します,いつもの 8KB または 16KB
$chunkSize = 8192; // 8KB
// ファイルを読んで、ハッシュ値をリアルタイムで更新します
while (!feof($fileStream)) {
$data = fread($fileStream, $chunkSize);
hash_update_stream($hashContext, $data);
}
// 最終的なハッシュ値を取得します
$fileHash = hash_final($hashContext);
// 出力ファイルのハッシュ値
echo "ファイルのハッシュ値はです: " . $fileHash . "\n";
// ファイルストリームを閉じます
fclose($fileStream);
?>
ファイルストリームを開く<br> FOPEN関数を使用してファイルを開き、バイナリモード( RB )で読み取るように指定します。これは、読み取りコンテンツが異なるファイルエンコーディングやラインブレークのために問題を引き起こさないようにするためです。
初期化ハッシュアルゴリズム
HASH_INIT()は、ハッシュアルゴリズムの初期化に使用され、選択したハッシュアルゴリズム( SHA256 、 MD5など)のハッシュアルゴリズムに渡されます。これにより、ハッシュ値を段階的に計算するためのハッシュコンテキストが作成されます。
ファイルを読んで、ハッシュ<br>を更新します Freadを使用して、毎回固定サイズのファイルチャンク(8kbなど)を読み取ります。次に、 hash_update_streamを使用して、読み取りデータブロックをリアルタイムでハッシュコンテキストに更新します。
最終的なハッシュ値<br>を取得します hash_final()関数を使用して、最終計算されたハッシュ値を取得し、ファイルストリームを閉じます。
大きなファイルハッシュ計算<br> 大きなファイル(1GBを超えるファイルなど)を処理する場合、ファイルを一度にメモリにロードすることはできません。この時点で、チャンクでファイルを読み取り、ハッシュ値を計算すると、メモリの使用量を効果的に減らすことができます。
ファイルの整合性検証<br> ファイルの内容を送信中にファイルの内容が改ざんされないようにする必要があるシナリオの場合、ハッシュ値を介してファイルの整合性を検証することが非常に重要です。
ブロックサイズを動的に調整します<BR> 読み取りブロックのサイズは、システムのメモリとディスクのパフォーマンスに従って調整できます。適切なブロックサイズを選択すると、パフォーマンスがさらに向上する可能性があります。
マルチスレッド処理<br> 非常に大きなファイルの場合、マルチスレッドテクノロジーを使用してファイルのさまざまな部分を同時に処理して、効率をさらに向上させることを検討できます。
ファイルが大きすぎると、メモリが不十分になります<br> ストリーミングを使用してファイルを読み取り、チャンクごとにハッシュ値チャンクを更新する場合、ファイル自体がメモリに完全にロードされていないため、メモリオーバーフローの問題を回避します。
hash_update_stream関数によってサポートされていないファイル形式<br> この関数はバイナリデータストリームを処理するため、テキストファイル、写真、ビデオなどを含むあらゆるタイプのファイルを処理するために使用できます。