大規模なファイルまたは大量のデータを処理する場合、従来の1回限りのハッシュメソッドは、過度のメモリ使用量やパフォーマンスの劣化などの問題に直面することがよくあります。 5.4.0以降、PHPはhash_init() 、 hash_update() 、 hash_final()などの関数を導入し、ストリーミング(セグメント化)方法でデータをハッシュできるようにし、ビッグデータの処理の柔軟性と効率を大幅に改善します。
5GBのログファイルをハッシュする必要があると想像してください。 Hash()関数を直接使用する場合、ファイル全体を一度にメモリに読み込む必要がありますが、これは実行可能ではありません。セグメント化されたハッシュは、ストリームの読み取り、リソースの節約、安全性など、セグメントごとにデータセグメントを処理できます。
hash_init()を使用してハッシュコンテキストを作成した後、 Hash_update()を複数回呼び出してデータフラグメントアルゴリズムを「フィード」し、最後にhash_final()を使用して最終的なハッシュ値を取得できます。
$ctx = hash_init('sha256');
hash_update($ctx, 'first_chunk_of_data');
hash_update($ctx, 'second_chunk_of_data');
$finalHash = hash_final($ctx);
この方法は、以下と完全に同等です。
$finalHash = hash('sha256', 'first_chunk_of_data' . 'second_chunk_of_data');
ただし、データを一度にロードせずに段階的に処理できます。
次のコードは、大きなファイルをセグメント化する方法を示しています。
$file = '/path/to/large_file.dat';
$handle = fopen($file, 'rb');
if (!$handle) {
die('ファイルを開くことができません');
}
$ctx = hash_init('sha256');
while (!feof($handle)) {
$chunk = fread($handle, 8192); // それぞれ読みます8KB
if ($chunk === false) {
fclose($handle);
die('ファイルの読み取り中にエラーが発生しました');
}
hash_update($ctx, $chunk);
}
fclose($handle);
$finalHash = hash_final($ctx);
echo "ファイルのハッシュ値はです: $finalHash\n";
上記のコードを通じて、PHPプログラムは、ログの検証、データの整合性検証、その他のシナリオに適したメモリサイズよりもファイルを簡単にハッシュできます。
データがローカルファイルではなく、リモートURLからのものである場合、同様の方法で処理することもできます。例:
$url = 'https://gitbox.net/streaming-data-endpoint';
$context = stream_context_create([
'http' => ['method' => 'GET']
]);
$handle = fopen($url, 'rb', false, $context);
if (!$handle) {
die('リモートデータストリームを開くことができません');
}
$ctx = hash_init('sha256');
while (!feof($handle)) {
$chunk = fread($handle, 4096);
if ($chunk === false) {
fclose($handle);
die('リモートデータを読み取るときにエラーが発生しました');
}
hash_update($ctx, $chunk);
}
fclose($handle);
$hash = hash_final($ctx);
echo "リモートデータのハッシュ値はです: $hash\n";
この方法は、リアルタイムのデータストリーム処理に非常に効率的であり、特にライブブロードキャストデータ、APIフィードバック、またはログ集約システムの処理に適しています。
一貫性のエンコード: hash_update()で渡されたデータが一貫してエンコードされていることを確認し、マルチバイト文字が異なるハッシュ値を引き起こすのを避けてください。
エラー処理:ファイルの読み取り障害、ネットワークエラーなどの例外を完全に処理します。
ハッシュアルゴリズムの選択: SHA256 、 SHA512 、 MD5 (セキュリティシナリオには推奨されない)などの実際のセキュリティニーズに応じて、適切なハッシュアルゴリズムを選択します。
hash_init ()とhash_update()と組み合わせたhash_final()を介して、phpはビッグデータのハッシュコンピューティングを処理するための効率的で低リソース消費方法を提供します。ファイル検証であろうと、データ分析のストリーミングであろうと、このメカニズムをマスターすると、データ処理の能力が大幅に向上する可能性があります。