PHPでは、 hash_update_stream()関数を使用すると、作成されたハッシュコンテキストを更新できます。静的データとは異なり、ストリーミングデータは非常に大きくなるか、一度にメモリにロードすることができないため、ストリーミングの使用が非常に重要です。この記事では、zip://またはphp://フィルターと組み合わせて、 hash_update_stream()関数を使用する方法を紹介して、ストリーミングデータを処理します。
hash_update_stream()は、ファイルやネットワークデータストリームなどのストリーミングデータを処理することにより、ハッシュコンテキストを更新するPHPのハッシュ関数です。その使用法は次のとおりです。
hash_update_stream ( resource $context , resource $handle [, int $length = 1024 ] ) : bool
$コンテキスト:これは、hash_init()によって作成されたハッシュコンテキストです。
$ハンドル:これは、ファイルハンドルやその他のストリームタイプなど、ストリームから読み取る必要があるデータストリームリソースです。
$ length :これは、時間ごとに読み取られるバイト数であり、デフォルトは1024バイトです。
PHPでは、 zip://は、zipファイルからデータストリームを直接読み取るための特別なプロトコルです。圧縮ファイルをハッシュする必要がある場合、 zip:// protocolを介してファイルコンテンツにアクセスし、 hash_update_stream()を使用してストリーミングデータを処理できます。
zip file example.zipがあり、 file.txtというテキストファイルが含まれているとします。次のコードを使用できます。
<?php
// ハッシュコンテキストを作成します
$hashContext = hash_init('sha256');
// 使用 zip:// プロトコル読み取り ZIP ファイル内のデータフロー
$zipStream = fopen('zip://example.zip#file.txt', 'r');
if ($zipStream) {
// ハッシュ値を更新します
while (!feof($zipStream)) {
hash_update_stream($hashContext, $zipStream);
}
fclose($zipStream);
// 最終的なハッシュ値を取得します
$hashValue = hash_final($hashContext);
echo "SHA-256 Hash of the file: " . $hashValue;
} else {
echo "ファイルを開くことができません!";
}
?>
PHP://フィルターは、入力ストリームをフィルタリングできる非常に強力なストリームカプセル化です。たとえば、 php://フィルターを介してデータを圧縮、減圧、または変換できます。 hash_update_stream()と組み合わせて、何らかのフィルターで処理されたストリーミングデータをハッシュできます。
php://フィルターを介してテキストファイルのハッシュ値を読み取り、計算すると同時に、同時にデータで文字変換を実行します。 php://フィルターを使用してconvert.iconv.utf-8/iso-8859-1を介して変換され、ハッシュを計算する方法を示す方法を示す例を示します。
<?php
// ハッシュコンテキストを作成します
$hashContext = hash_init('md5');
// 使用 php://filter 文字エンコーディングを読んで変換します
$filteredStream = fopen('php://filter/read=convert.iconv.UTF-8/ISO-8859-1/resource=example.txt', 'r');
if ($filteredStream) {
// ハッシュ値を更新します
while (!feof($filteredStream)) {
hash_update_stream($hashContext, $filteredStream);
}
fclose($filteredStream);
// 最終的なハッシュ値を取得します
$hashValue = hash_final($hashContext);
echo "MD5 Hash of the file after conversion: " . $hashValue;
} else {
echo "ファイルを開くことができません!";
}
?>
hash_update_stream()関数とzip://またはphp://フィルタープロトコルを組み合わせることにより、圧縮ファイルまたはプロセスされたストリーミングデータを柔軟にハッシュできます。 hash_update_stream()のストリーミング処理機能により、データボリュームが非常に大きい場合でも、メモリをあまり消費せずにハッシュ値を効率的に計算できます。 zipファイルからデータを読み取るか、ストリームで変換をエンコードする文字を適用するかに関わらず、 hash_update_stream()は、これらのシナリオを処理するためのシンプルで効率的な方法を提供します。