Dans le développement de PHP, md5_file () est une fonction couramment utilisée pour générer des valeurs de hachage de contenu de fichier. Les développeurs l'utilisent généralement pour vérifier si le fichier a changé ou pour vérifier l'intégrité du fichier. Cependant, de nombreux développeurs rencontrent un problème apparemment "inexplicable" lors de l'utilisation de cette fonction: la valeur de hachage obtenue en utilisant md5_file () dans différents environnements de codage est différent.
Cela semble contre-intuitif, mais il y a des raisons techniques claires derrière elle. Cet article explorera pourquoi cette situation se produit du point de vue de l'encodage.
Tout d'abord, nous devons comprendre l'essence de md5_file () :
$hash = md5_file('/path/to/file.txt');
Cette fonction lit les données binaires d'origine de l'ensemble du fichier, puis calcule sa valeur MD5. Par conséquent, il se concentre sur le contenu de l'octet de fichier lui-même , plutôt que sur le texte lisible par l'homme.
En d'autres termes, la valeur MD5 sera différente même si le texte affiché visuellement est exactement le même tant que tout changement dans les octets du fichier.
Un malentendu commun est que si le contenu est le même, la même valeur MD5 doit être obtenue. En fait:
Le caractère "Medium" est de trois octets dans UTF-8: 0xe4 0xb8 0xad
Dans GBK, il s'agit de deux octets: 0xd6 0xd0
Si vous avez deux fichiers, l'un est un codage UTF-8 et l'autre est le codage GBK, qui dit visuellement "test chinois", mais après avoir lu MD5_File (), vous constaterez que leurs flux d'octets sous-jacents sont différents et que les valeurs de hachage naturelles sont également différentes.
Les développeurs écrivent souvent des fichiers PHP ou texte dans l'éditeur. Si l'éditeur l'enregistre en tant que UTF-8 par défaut (avec ou sans bom), ou l'enregistre comme ANSI / GBK, il entraînera une incohérente le flux d'octets réel du fichier.
Par exemple, l'enregistrement d'un fichier dans le bloc-notes de Windows est le codage ANSI par défaut; Bien que l'enregistrement dans le code vs est sans bom par défaut. Le contenu des deux fichiers semble être le même, mais via le code suivant:
echo md5_file('file-ansi.txt') . "\n";
echo md5_file('file-utf8.txt') . "\n";
Vous verrez différentes sorties de hachage.
Supposons que nous déployons le script PHP suivant sur m66.net :
$file1 = 'https://m66.net/files/utf8.txt'; // UTF-8 codage
$file2 = 'https://m66.net/files/gbk.txt'; // GBK codage
echo 'UTF-8: ' . md5_file($file1) . "\n";
echo 'GBK: ' . md5_file($file2) . "\n";
Les résultats de l'exécution montrent clairement que les valeurs MD5 des deux sont différentes.
Format de codage unifié : L'utilisation forcée de l'UTF-8 (pas de bom) comme seul format de codage dans le projet est le moyen le plus simple et le plus efficace.
Convertir le codage avant d'enregistrer le fichier : utilisez des outils tels que iconv ou mb_convert_encoding () pour convertir le contenu du fichier en format unifié.
Par exemple:
$content = file_get_contents('file.txt');
$content = mb_convert_encoding($content, 'UTF-8', 'GBK');
file_put_contents('converted.txt', $content);
Confirmer les paramètres de l'éditeur : assurez-vous que l'ide ou l'éditeur de texte que vous utilisez définissez un format de codage par défaut cohérent.
md5_file () dépend du flux d'octet d'origine du fichier, et toute différence de codage affectera ses résultats de calcul. Comprendre cela est crucial pour gérer le contenu de fichiers multilingues et multiplateforme. Dans les projets réels, le maintien de l'encodage des fichiers est une mesure clé pour assurer l'efficacité de la vérification du hachage.