【PHP8.x】hash_file関数の使い方

作成日: 更新日:

hash_file関数は、指定されたファイルの内容全体からハッシュ値(チェックサムやメッセージダイジェストとも呼ばれます)を計算して返す関数です。この関数は、md5sha256など、PHPのhash拡張モジュールがサポートする様々なハッシュアルゴリズムを利用できます。引数としてハッシュ化したいファイルのパスと、使用するハッシュアルゴリズムの名前(文字列)を指定します。

ファイル内容のわずかな変更でもハッシュ値は大きく異なります。この特性を利用して、ファイルの整合性確認や第三者による改ざん検出に利用されます。例えば、インターネットからダウンロードしたファイルが破損していないか、あるいは途中で不正に変更されていないかを確認する際に非常に役立ちます。

計算が成功すると、ファイルの内容から生成されたハッシュ値を表す文字列を返します。もし、指定されたファイルが見つからない、または読み取り権限がないなどの失敗時にはfalseを返します。そのため、エラー処理のために関数の戻り値を適切に確認することが重要です。ハッシュ値は一方向性(不可逆性)を持っており、ハッシュ値から元のファイルの内容を復元することはできませんので、セキュリティ関連の様々な用途にも適しています。

基本的な使い方

構文(syntax)

<?php

// 一時ファイルを作成し、内容を書き込む
$filename = 'example.txt';
file_put_contents($filename, 'このファイルのハッシュ値を計算します。');

// 指定されたファイルの内容のハッシュ値を計算
// 第1引数: 使用するハッシュアルゴリズム名 (例: 'md5', 'sha256')
// 第2引数: ハッシュ値を計算するファイルのパス
$hash = hash_file('sha256', $filename);

// 計算結果を出力
if ($hash !== false) {
    echo $hash . PHP_EOL;
} else {
    echo "ファイルのハッシュ値の計算に失敗しました。" . PHP_EOL;
}

// 作成した一時ファイルを削除
unlink($filename);

?>

引数(parameters)

string $algo, string $filename, bool $binary = false, array $options = array ()

  • string $algo: ハッシュアルゴリズム名を指定する文字列
  • string $filename: ハッシュを計算するファイルのパスを指定する文字列
  • bool $binary = false: true を指定すると、バイナリ形式のハッシュ値を返します。デフォルトは false で、16進数形式のハッシュ値を返します。
  • array $options = array (): ハッシュ計算に関連するオプションを指定する連想配列

戻り値(return)

string|false

指定されたファイルの内容をハッシュ化した文字列、またはハッシュ化に失敗した場合は false を返します。

サンプルコード

PHP hash_file でファイルハッシュを計算する

<?php

/**
 * hash_file関数の基本的な使用方法を示すサンプルコード。
 * 指定されたファイルの内容からハッシュ値を計算します。
 */
function demonstrateHashFile(): void
{
    // 一時ファイルの名前を定義します。
    $filename = 'temp_file_for_hash.txt';
    // ファイルに書き込む内容を定義します。
    $fileContent = 'これはハッシュ計算の対象となるサンプルテキストです。';

    // 1. ハッシュ計算用のサンプルファイルを作成します。
    // file_put_contentsはファイルにデータを書き込みます。
    if (file_put_contents($filename, $fileContent) === false) {
        echo "エラー: ファイル '{$filename}' を作成できませんでした。" . PHP_EOL;
        return;
    }
    echo "ファイル '{$filename}' を作成しました。" . PHP_EOL;

    // 2. hash_file関数を使用してファイルのハッシュ値を計算します。
    // 'sha256'は一般的なハッシュアルゴリズムの一つです。
    // $binary = false (デフォルト): ハッシュ値を16進数文字列で返します。
    $algorithm = 'sha256';
    $hashValue = hash_file($algorithm, $filename);

    // 3. 結果を表示し、エラーがあれば報告します。
    if ($hashValue !== false) {
        echo "ファイル '{$filename}' の {$algorithm} ハッシュ値: " . $hashValue . PHP_EOL;
    } else {
        echo "エラー: ファイル '{$filename}' のハッシュ値を計算できませんでした。" . PHP_EOL;
    }

    // 4. 使用したサンプルファイルを削除します。
    // unlinkはファイルを削除する関数です。
    if (file_exists($filename)) {
        if (unlink($filename)) {
            echo "ファイル '{$filename}' を削除しました。" . PHP_EOL;
        } else {
            echo "エラー: ファイル '{$filename}' を削除できませんでした。" . PHP_EOL;
        }
    }
}

// 関数の実行
demonstrateHashFile();

?>

PHPのhash_file関数は、指定したファイルの内容からハッシュ値を計算するために使用されます。ファイルの改ざん検出や内容の一意性確認といったセキュリティ関連の用途で役立ちます。

この関数は主に3つの引数を取ります。最初の$algoには、ハッシュ計算に使用するアルゴリズム名を文字列で指定します。「sha256」や「md5」などが利用可能です。次に$filenameには、ハッシュ値を計算したいファイルのパスを文字列で渡します。3番目の$binaryはオプションで、デフォルトではfalseです。falseの場合、ハッシュ値は一般的に使用される16進数形式の文字列として返されます。trueを設定すると、生バイナリ形式で返されますが、通常はfalseのままで問題ありません。

関数が正常に実行されると、計算されたハッシュ値が文字列として返されます。ファイルの読み込みエラーなどが発生した場合はfalseが返されるため、戻り値がfalseでないかを確認し、エラー処理を行うことが重要です。

提示されたサンプルコードでは、まず一時的なテキストファイルを作成し、そのファイルにサンプル内容を書き込んでいます。次に、hash_file関数を使い、「sha256」アルゴリズムで作成したファイルの内容のハッシュ値を計算し、結果を表示しています。これにより、ファイルの内容が期待通りであるかをプログラム的に検証できることを示しています。最後に、作成した一時ファイルを削除しています。

hash_file関数は、指定されたファイルの改ざん検出などに利用できます。第一引数のハッシュアルゴリズムはhash_algos()関数で利用可能なものを確認し、セキュリティ要件に応じた適切なアルゴリズムを選択してください。

ファイルが存在しない、または読み取り権限がない場合、そして無効なアルゴリズムを指定した場合は、関数はfalseを返します。そのため、戻り値がfalseでないか===で厳密に確認し、エラーを適切に処理することが非常に重要です。

サンプルコードのように一時ファイルを扱う場合は、ファイルの作成や削除が失敗する可能性も考慮し、エラー発生時でもファイルが確実にクリーンアップされるロジックを組み込むように注意しましょう。

PHP hash_file パフォーマンス比較

<?php

/**
 * hash_file() 関数のパフォーマンスを比較するサンプルコードです。
 *
 * 異なるハッシュアルゴリズム(例: MD5, SHA256, SHA512)を用いて、
 * 指定されたサイズのファイルのハッシュ値を計算する際の処理時間を計測します。
 * これにより、どのアルゴリズムが速いか、遅いかといったパフォーマンスの違いを理解できます。
 *
 * @param int $fileSizeMB 比較に使用するダミーファイルのサイズ(MB単位)。
 */
function measureHashFilePerformance(int $fileSizeMB = 10): void
{
    // --- 1. ハッシュ計算対象となるダミーファイルを作成します ---
    $filename = 'performance_test_file.bin';
    $fileSize = $fileSizeMB * 1024 * 1024; // MBをバイトに変換

    echo "{$fileSizeMB}MBのダミーファイル「{$filename}」を作成中... ";
    $fileHandle = fopen($filename, 'wb'); // バイナリ書き込みモードでファイルを開きます
    if ($fileHandle === false) {
        echo "エラー: ダミーファイルの作成に失敗しました。\n";
        return;
    }

    // ランダムなデータを少しずつファイルに書き込み、指定サイズのダミーファイルを作成します。
    // largeファイルを作成する場合、一括でのメモリ確保を避けるためチャンクに分けて書き込みます。
    $chunkSize = 1024 * 1024; // 1MBずつ書き込む
    $bytesWritten = 0;
    while ($bytesWritten < $fileSize) {
        $writeSize = min($chunkSize, $fileSize - $bytesWritten);
        // random_bytes() はPHP 7.0以降で利用可能な、安全な乱数を生成する関数です。
        fwrite($fileHandle, random_bytes($writeSize));
        $bytesWritten += $writeSize;
    }
    fclose($fileHandle);
    echo "完了。\n\n";

    // --- 2. 異なるハッシュアルゴリズムでファイルのハッシュ値を計算し、処理時間を計測します ---
    echo "各ハッシュアルゴリズムでのファイルハッシュ計算時間を計測します:\n";

    // 比較したいハッシュアルゴリズムのリスト
    $algorithms = ['md5', 'sha1', 'sha256', 'sha512'];

    foreach ($algorithms as $algo) {
        $startTime = microtime(true); // 処理開始時刻(秒単位、浮動小数点数)を記録
        $hashValue = hash_file($algo, $filename); // hash_file() 関数を実行してファイルのハッシュ値を計算
        $endTime = microtime(true);   // 処理終了時刻を記録

        if ($hashValue === false) {
            echo "  エラー: '{$algo}'でのハッシュ計算に失敗しました。\n";
        } else {
            $duration = $endTime - $startTime; // 処理時間を計算
            echo "  - アルゴリズム: '{$algo}'\n";
            // ハッシュ値は非常に長くなることがあるため、一部のみ表示します
            echo "    ハッシュ値  : " . substr($hashValue, 0, 40) . "...\n";
            // 処理時間を小数点以下6桁まで表示します
            echo "    処理時間    : " . sprintf('%.6f', $duration) . " 秒\n\n";
        }
    }

    // --- 3. 作成したダミーファイルを削除します ---
    if (file_exists($filename)) {
        unlink($filename); // ファイルを削除
        echo "ダミーファイル「{$filename}」を削除しました。\n";
    }
}

// スクリプトの実行: 10MBのダミーファイルを用いてパフォーマンス比較を実行します。
measureHashFilePerformance(10);

?>

PHPのhash_file関数は、指定したファイルのコンテンツからハッシュ値を計算するために使用されます。ファイルの改ざん検出や内容検証によく利用される重要な関数です。第一引数$algoには使用するハッシュアルゴリズム(例: 'md5'や'sha256')を文字列で指定し、第二引数$filenameにはハッシュ値を計算したいファイルのパスを指定します。オプションの第三引数$binarytrueに設定すると、ハッシュ値がバイナリ形式で返されます。第四引数$optionsでは、追加の設定を配列で渡すことが可能です。この関数は、ハッシュ値の計算に成功するとそのハッシュ値の文字列を返し、失敗した場合はfalseを返します。

このサンプルコードでは、hash_file関数を用いて、異なるハッシュアルゴリズムが同じサイズのファイルを処理する際のパフォーマンス(処理速度)を比較しています。これにより、どのアルゴリズムがより高速に動作し、どの程度時間がかかるのか、具体的な違いを理解することができます。ファイルサイズが大きくなるほど、アルゴリズムによる処理速度の差が顕著になるため、システム設計時にはハッシュアルゴリズムの適切な選択が重要となります。

hash_file関数の戻り値は、成功時にはハッシュ値の文字列、失敗時にはfalseです。サンプルコードのように、必ず=== falseで厳密に確認し、適切なエラー処理を行うことが重要です。ファイルを扱う処理では、作成したダミーファイルを忘れずに削除し、ディスク容量を圧迫しないよう注意してください。また、fopenunlinkといったファイル操作は、指定されたパスの存在やアクセス権の問題で失敗する可能性があるため、常にエラーハンドリングを意識しましょう。処理時間の計測は、実行環境やその時のシステム負荷に大きく左右されますので、結果はあくまで参考として捉え、厳密な比較には複数回の実行や平均値の算出を検討すると良いでしょう。random_bytesはセキュリティ上安全な乱数を生成しますが、大量のデータを扱う際はメモリ使用量にも留意が必要です。

【PHP8.x】hash_file関数の使い方 | いっしー@Webエンジニア