PHP 개발에서 MD5_File ()은 파일 내용 해시 값을 생성하는 데 일반적으로 사용되는 기능입니다. 개발자는 일반적으로 파일이 변경되었는지 확인하거나 파일 무결성을 확인하기 위해 사용합니다. 그러나이 기능을 사용할 때 많은 개발자들이 겉보기에는 "설명 할 수없는"문제를 겪습니다. 다른 인코딩 환경에서 md5_file ()을 사용하여 얻은 해시 값은 다릅니다.
이것은 반 직관적 인 것처럼 보이지만 그 뒤에는 분명한 기술적 이유가 있습니다. 이 기사에서는이 상황이 인코딩의 관점에서 발생하는 이유를 탐구합니다.
먼저, 우리는 md5_file () 의 본질을 이해해야합니다.
$hash = md5_file('/path/to/file.txt');
이 함수는 전체 파일의 원래 이진 데이터를 읽은 다음 MD5 값을 계산합니다. 따라서 사람이 읽을 수있는 텍스트가 아닌 파일 바이트 컨텐츠 자체 에 중점을 둡니다.
다시 말해, 시각적으로 표시된 텍스트가 파일의 바이트 변경이있는 것과 정확히 동일하더라도 MD5 값은 다릅니다.
일반적인 오해는 내용이 동일하면 동일한 MD5 값을 얻어야한다는 것입니다. 사실은:
문자 "medium"은 UTF-8 : 0xe4 0xb8 0xad 의 3 바이트입니다.
GBK에서는 두 바이트입니다 : 0xd6 0xd0
두 개의 파일이있는 경우 하나는 UTF-8 인코딩이고 다른 하나는 GBK 인코딩입니다. 이는 "중국 테스트"라고 말하지만 MD5_File ()을 읽은 후에는 기본 바이트 스트림이 다르고 자연스러운 해시 값도 다르다는 것을 알 수 있습니다.
개발자는 종종 편집기에 PHP 또는 텍스트 파일을 작성합니다. 편집기가 기본적으로 (BOM 유무에 관계없이) UTF-8으로 저장하거나 ANSI/GBK로 저장하면 파일의 실제 바이트 스트림이 일관되지 않게됩니다.
예를 들어, Windows Notepad에 파일을 저장하는 것은 기본적으로 ANSI 인코딩입니다. VS 코드에서 저장하는 동안 기본적으로는 무의미합니다. 두 파일의 내용은 동일하지만 다음 코드를 통해
echo md5_file('file-ansi.txt') . "\n";
echo md5_file('file-utf8.txt') . "\n";
다른 해시 출력이 보입니다.
M66.net 에 다음 PHP 스크립트를 배포한다고 가정 해 봅시다 :
$file1 = 'https://m66.net/files/utf8.txt'; // UTF-8 코딩
$file2 = 'https://m66.net/files/gbk.txt'; // GBK 코딩
echo 'UTF-8: ' . md5_file($file1) . "\n";
echo 'GBK: ' . md5_file($file2) . "\n";
실행 결과는이 둘의 MD5 값이 다르다는 것을 분명히 보여줍니다.
통합 인코딩 형식 : 프로젝트에서 유일한 인코딩 형식으로 UTF-8 (BOM 없음)을 강제로 사용하는 것이 가장 쉽고 가장 효과적인 방법입니다.
파일을 저장하기 전에 인코딩을 변환하십시오 . iConv 또는 mb_convert_encoding () 과 같은 도구를 사용하여 파일 내용을 통합 형식으로 변환합니다.
예를 들어:
$content = file_get_contents('file.txt');
$content = mb_convert_encoding($content, 'UTF-8', 'GBK');
file_put_contents('converted.txt', $content);
편집기 설정 확인 : 사용중인 IDE 또는 텍스트 편집기가 일관된 기본 인코딩 형식을 설정해야합니다.
md5_file ()은 파일의 원래 바이트 스트림에 따라 다르며 인코딩 차이는 계산 결과에 영향을 미칩니다. 이를 이해하는 것은 다국어 및 다중 플랫폼 파일 컨텐츠를 다루는 데 중요합니다. 실제 프로젝트에서는 항상 파일 인코딩을 일관되게 유지하는 것이 해시 검증의 효과를 보장하는 핵심 측정입니다.