Position actuelle: Accueil> Derniers articles> Comment les problèmes d'encodage affectent les résultats de md5_file ()

Comment les problèmes d'encodage affectent les résultats de md5_file ()

M66 2025-06-02

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.

L'essence de md5_file ()

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.

Différents encodages peuvent être différents

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.

L'encodage lors de l'enregistrement du fichier affectera également les résultats

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.

Exemple: comparaison de deux fichiers avec différents encodages

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.

Comment éviter ce problème?

  1. 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.

  2. 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);
  1. 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.

Résumer

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.