PHPでは、大きなファイルを処理する場合、ハッシュ計算のためにファイル全体をメモリに直接ロードすると、特にファイルが非常に大きい場合は、多くのメモリリソースを占める可能性があります。この問題を解決するために、PHPはphp:// stdin streamとhash_update_stream()関数を提供します。 2つの組み合わせは、ストリーミングハッシュ処理、つまり、メモリのオーバーフローを避けるためにファイルコンテンツを読みながらハッシュ計算を実装できます。
この記事では、特に大きなファイルを使用する場合、ハッシュ値を効率的に計算する方法、コマンドラインでのハッシュ計算をストリーミングするためにこれら2つのツールを使用する方法を示します。
まず、PHPがインストールされていることを確認し、コマンドラインからPHPスクリプトを実行できるようにしてください。次のコマンドに従って、PHPが正しくインストールされているかどうかを確認できます。
php -v
PHPをインストールしていない場合は、 http://m66.net/download/phpにPHPをダウンロードしてインストールできます。
次に、PHPの内蔵PHP:// stdinストリームを使用して標準入力を読み取り、 Hash_update_stream()関数をHash計算に組み合わせます。
php:// stdinは、標準の入力(通常はコマンドラインからの入力ストリーム)からデータを読み取ることができる特別なストリームです。データ全体をメモリにロードせずに、大きなファイルやライブ入力ストリームを処理するために使用できます。
hash_update_stream()関数は、ハッシュ値を計算するためにPHPで使用される関数の1つです。通常のhash_update()関数とは異なり、ストリームを介してハッシュ値を直接更新することができます。これにより、ビッグデータを扱うときに特に役立ちます。
bool hash_update_stream ( resource $context , resource $stream [, int $length = 8192 ] )
$コンテキスト: hash_init()によって作成されたハッシュコンテキスト。
$ stream :ハッシュの計算に使用されるストリーム(この場合、 php:// stdin )。
$の長さ:一度に読み取られるバイトの最大数(デフォルトは8192バイトです)。
ストリーミングハッシュ計算にphp:// stdinおよびhash_update_stream()の使用方法を示す簡単な例を示します。
<?php
// aを作成します SHA256 ハッシュコンテキスト
$context = hash_init('sha256');
// 開ける php://stdin 流れ
$stream = fopen('php://stdin', 'r');
// それぞれ読みます 8192 データのバイトとハッシュ値を更新します
while (!feof($stream)) {
$data = fread($stream, 8192);
hash_update_stream($context, $data);
}
// 最終的なハッシュ値を計算します
$hash = hash_final($context);
// 計算されたハッシュ値を出力します
echo "計算されたハッシュ値はです:$hash\n";
// ストリームを閉じますれ
fclose($stream);
?>
上記のコードをhash_stdin.phpとして保存します。
コマンドラインでのハッシュ計算のためのスクリプトにデータをパイプします。たとえば、ファイルを読んで、そのsha256ハッシュを計算します。
cat largefile.txt | php hash_stdin.php
または、次のように入力して、ハッシュ計算を直接使用できます。
echo "Hello, World!" | php hash_stdin.php
ハッシュコンテキストを作成します:
hash_init( 'sha256')を使用してSHA256ハッシュコンテキストを作成します。 「SHA256」をMD5 、 SHA1などの他のサポートされているハッシュアルゴリズムに置き換えることができます。
標準の入力ストリームを開きます:
fopen( 'php:// stdin'、 'r')は、標準入力を指すストリームを開きます。これにより、コマンドラインから入力データを読み取ることができます。
ハッシュを読んで更新します:
fread()を使用してブロックごとにデータブロックを読み取り(毎回8192バイトが読み取られます)、 hash_update_stream()を使用してハッシュ計算を更新します。
最終的なハッシュ値を計算します。
ファイルが読み取られたら、 hash_final()を呼び出して最終的なハッシュ値を計算して取得します。
出力ハッシュ値:
エコーを使用して、計算されたハッシュ値をコマンドラインに出力します。
大きなファイルの処理: php:// stdinおよびhash_update_stream()を使用することは、メモリに完全にロードすることなく大きなファイルを処理する必要がある場合に理想的なソリューションです。これにより、データを段階的に読み取り、ハッシュ計算を実行できます。
リアルタイムのデータストリーム:これは、ネットワーク接続またはセンサーデバイスから取得したデータストリームなど、リアルタイムデータストリームをハッシュする必要がある場合にも可能です。
非常に大きなファイルを扱うときは、読み取られたバイト数(長さ)の数が合理的に設定されていることを確認してください。デフォルトでは、 FREAD()は一度に最大8192バイトのデータを読み取り、必要に応じてパフォーマンスを改善するために大きな値に調整できます。
ストリーミングを使用する場合は、リソースの漏れを避けるために、操作が完了したら、常にストリーミングリソースを閉じるようにしてください。
php:// stdinとhash_update_stream()を組み合わせることにより、大きなファイルまたはリアルタイムのデータストリームのハッシュ計算を非常に効率的に処理できます。この方法は、メモリを保存するだけでなく、コマンドラインのシンプルで高速なハッシュ計算を可能にします。巨大なファイルまたはストリーミングデータに取り組んでいる場合は、このストリーミング方法を強くお勧めします。
この記事が、コマンドラインのストリーミングハッシュにPHPを使用する方法を理解するのに役立つことを願っています。ご質問やご不明な点がございましたら、お気軽にお問い合わせください。