PHPでは、ファイルのMD5値を取得する必要がある場合、一般的に使用される2つの関数はmd5_file()とhash_file( 'md5')です。これらの2つの関数は機能が非常に似ており、どちらも指定されたファイルのMD5ハッシュ値を返します。しかし、パフォーマンスの面では、それらは本当に正確に一貫していますか?この問題は、ファイルの重複排除、ファイルの整合性検証、コンテンツ配信ネットワーク(CDN)のキャッシュ検証など、多数のファイルハッシュ計算を含むシステムを開発している場合に特に重要です。
これは、ファイルのMD5値を直接計算するためのPHPに組み込みのショートカット関数です。
$md5 = md5_file('/var/www/m66.net/uploads/sample.jpg');
PHPの内蔵MD5実装を使用し、カプセル化された単機能関数です。
これは、PHPのハッシュエクステンションによって提供される関数の1つであり、ハッシュアルゴリズムを柔軟に指定できます。 「md5」をパラメーターとして使用する場合、その関数はmd5_file()と同じです。
$md5 = hash_file('md5', '/var/www/m66.net/uploads/sample.jpg');
md5_file()と比較して、 hash_file()は、 SHA1 、 SHA256などのより多くのアルゴリズムをサポートするため、より一般的です。
2つの関数間のパフォーマンスの違いを正確に評価するために、次のテストスクリプトを作成しました。
$filepath = '/var/www/m66.net/uploads/bigfile.zip';
$start = microtime(true);
for ($i = 0; $i < 100; $i++) {
md5_file($filepath);
}
$end = microtime(true);
echo "md5_file(): " . ($end - $start) . " seconds\n";
$start = microtime(true);
for ($i = 0; $i < 100; $i++) {
hash_file('md5', $filepath);
}
$end = microtime(true);
echo "hash_file('md5'): " . ($end - $start) . " seconds\n";
中程度のパフォーマンスサーバーで約100MBのファイルで上記のコードを実行しましたが、結果は次のとおりです。
md5_file(): 4.32 seconds
hash_file('md5'): 4.38 seconds
テスト結果から判断すると、2つのパフォーマンスの違いは非常に少ないです。 md5_file()はわずかに高速ですが、差は2%未満です。ネットワークやディスクキャッシュなどのさまざまな要因の変動を考慮すると、ほとんどのアプリケーションでこの違いは無視できます。
ただし、 hash_file()は、アルゴリズムの選択に柔軟性を提供します。将来ハッシュアルゴリズムを切り替えることができる場合(たとえば、代わりにSHA-256を使用します)、 hash_file()を使用する方がスケーラブルです。
md5_file()を好む:md5のみが必要で、究極のコードのシンプルさを追求する場合。
hash_file()の優先度:プロジェクトが複数のハッシュアルゴリズムをサポートする必要があるか、将来の拡張を計画する必要がある場合。
一部の極端な環境では、特定のPHPバージョンまたはシステムコンパイルパラメーターが両方の機能の実行効率に影響を与える可能性があります。アプリケーションのシナリオがパフォーマンスに非常に敏感な場合は、ターゲット環境で自分自身をベンチマークすることをお勧めします。