毎日の開発では、多くの場合、ファイルを検証して、その完全性が破損しているかどうかを確認する必要があります。一般的な方法は、ファイルのMD5値を比較することです。 PHPはMD5_FILE()関数を提供しますが、 Hashlibモジュールを介してPythonで同様の機能を実装できます。それで、これら2つのプラットフォームによって計算されたMD5値は一貫していますか?比較して検証できますか?この記事では、原則、使用例、実際の比較の3つの側面から分析します。
PHPのMD5_FILE()は、ファイルの内容でMD5ハッシュを実行し、32ビットヘキサデシマルストリングを返すために使用される組み込み関数です。
使用例:
<?php
$file = 'example.txt';
$md5 = md5_file($file);
echo "MD5値はです:" . $md5;
?>
この例では、 MD5_FILE()はファイルコンテンツ全体を読み取り、MD5値を計算します。デフォルトでは、小文字32ビット16進数文字列を返します。
Pythonは、 Hashlibモジュールを介して実装できるファイルのMD5値を簡単に計算できます。
import hashlib
with open("example.txt", "rb") as f:
md5 = hashlib.md5()
while chunk := f.read(8192):
md5.update(chunk)
print("MD5値はです:", md5.hexdigest())
PHPと比較して、Pythonは、メモリ消費を減らすために、大きなファイルのブロックごとの読み取りを強調しています。
理論的には、 md5_file()およびpythonのhashlib.md5()は同じMd5ハッシュアルゴリズム(RFC 1321)を使用するため、同じファイルの内容を計算するときに結果はまったく同じでなければなりません。
同一のファイルを準備し、それぞれPHPとPythonでMD5値を計算できます。
ファイルのコンテンツは次のとおりです(example.txt):
Hello, this is a test file for MD5 hashing.
PHP出力:
<?php
echo md5_file('example.txt');
// 出力:1a79a4d60de6718e8e5b326e338ae533
?>
Python出力:
import hashlib
with open("example.txt", "rb") as f:
print(hashlib.md5(f.read()).hexdigest())
# 出力:1a79a4d60de6718e8e5b326e338ae533
出力MD5値は完全に一貫していることがわかります。つまり、アルゴリズムと実装レベルの2つに本質的な違いはありません。
関数自体の計算方法は一貫していますが、実際の使用ではまだ異なるMD5値がある場合があります。一般的な理由は次のとおりです。
ラインブレーク文字の違い:Windowsの下のCRLF( \ r \ n )、Linuxは通常LF( \ n )です。ファイルが2つのシステム間で均一なラインブレーク文字がない場合、MD5に影響します。
コーディングの問題:PHPとPythonはファイルを異なって読み取ります。バイナリモードを使用して、統一された方法でファイルを読み取ることをお勧めします。
ファイルが完全に記述されていない:計算中にファイルが閉じられていない場合、または記述されている場合、読み取りが不完全であり、異なる結果につながる可能性があります。
ファイルパスまたは許可の問題:ファイルパスが誤って綴られている場合、または許可が不十分な場合、読み取り、虚偽の返品、またはエラーの報告に失敗する場合があります。
また、リモートファイルのMD5を計算する必要がある場合があります。 PHPでは、次のように実装できます。
<?php
$url = 'https://m66.net/sample.jpg';
$temp_file = tempnam(sys_get_temp_dir(), 'md5');
file_put_contents($temp_file, file_get_contents($url));
echo md5_file($temp_file);
unlink($temp_file);
?>
Pythonでは、リクエストを使用してファイルをダウンロードしてから計算できます。
import hashlib, requests
url = "https://m66.net/sample.jpg"
r = requests.get(url)
md5 = hashlib.md5(r.content).hexdigest()
print(md5)
ダウンロードされたファイルコンテンツが一貫している限り、MD5値も一貫性を保ちます。
PHPのMD5_FILE()およびPythonのHashlib計算ファイルのMD5値は、アルゴリズム的に一貫しています。読み取りファイルのコンテンツが一貫しており、ファイルエンコードメソッドが一貫していることを確認する限り、結果に違いはありません。言語間ハッシュの結果を比較する場合、開発者はファイルの読み方、ラインブレーク、エンコード形式などの詳細に注意を払う必要があります。
ファイルMD5検証でこれら2つの言語の操作スキルを習得することで、多言語プロジェクトでのデータの一貫性とセキュリティを確保できます。