큰 파일을 처리 할 때 특히 파일이 많고 메모리에 직접로드 할 수없는 시나리오에서 파일이 변경되었는지 여부를 결정해야합니다. 전통적인 파일 비교 방법은 특히 파일 크기가 크면 더 많은 메모리를 소비 할 수 있습니다. 따라서 파일이 해시 값에 따라 수정되는지 여부를 감지하는 효율적이고 일반적으로 사용되는 방법입니다.
PHP에서 Hash_update_stream은 파일의 해시 값을 점차 계산하는 데 사용하여 큰 파일 수정의 감지를 실현할 수 있습니다. 이 기사는이 기능을 사용하여 파일 콘텐츠의 변경 사항을 확인하는 방법을 자세히 소개합니다.
hash_update_stream 은 PHP의 함수 (예 : 파일)의 해시 값을 계산하는 함수입니다. 파일 내용을 단계별로 처리하고 파일의 해시 값을 계산할 수 있습니다. 전체 파일의 해시를 직접 계산하는 것과 달리 Hash_update_stream은 전체 파일을 한 번에 메모리에로드하는 것을 피하기 때문에 큰 파일에 더 적합합니다.
파일이 수정되었는지 여부를 감지하기 위해 일반적으로 다음 단계를 통해 파일을 구현합니다.
파일의 해시 값을 생성하십시오 . 먼저 파일의 초기 해시 값을 생성해야합니다. 이 해시 값은 hash_update_stream 에 의해 계산 될 수 있으며 파일의 원래 상태의 "지문"으로 저장할 수 있습니다.
파일의 해시 값을 정기적으로 확인하십시오 . 파일이 변경되었는지 확인해야 할 때 파일의 해시 값을 다시 계산하고 이전에 저장된 해시 값과 비교하십시오.
파일이 수정되었는지 여부를 결정하십시오 . 새 해시 값이 이전 해시 값과 다른 경우 파일이 수정되었음을 의미합니다. 그렇지 않으면 파일이 변경되지 않았습니다.
위의 확인 함수를 구현하려면 먼저 파일의 해시 값을 계산하기 위해 hash_update_stream을 사용하는 방법을 이해해야합니다. 다음은 샘플 코드입니다.
<?php
// 파일 경로를 설정하십시오
$file = 'path/to/your/largefile.txt';
// 파일을 엽니 다
$stream = fopen($file, 'rb');
if (!$stream) {
die('无法파일을 엽니 다');
}
// 사용 hash_update_stream 점차 파일 해시 값을 계산합니다
$context = hash_init('sha256'); // 다른 해싱 알고리즘을 선택할 수 있습니다,예를 들어 sha256
while (!feof($stream)) {
$data = fread($stream, 8192); // 블록별로 파일을 읽습니다
hash_update_stream($context, $data); // 해시 값을 업데이트하십시오
}
// 최종 해시 값을 계산하십시오
$hash = hash_final($context);
fclose($stream);
// 출력 파일의 해시 값
echo "파일의 해시 값은입니다: $hash\n";
?>
위의 코드에서는 Hash_init을 통해 해시 컨텍스트를 작성하고 Hash_update_stream을 통해 해시 값을 점차 업데이트합니다. 매번 파일 스트림에서 작은 데이터 청크를 읽고 파일을 읽을 때까지 Hash_update_stream 으로 전달하십시오. 마지막으로 Hash_Final을 통해 파일의 최종 해시 값을 얻으십시오.
다음으로 파일의 해시 값을 저장하여 필요한 경우 비교할 수 있습니다. 파일이 수정되었는지 확인하는 샘플 코드는 다음과 같습니다.
<?php
// 원래 해시 값을 저장하는 파일 경로
$hashFile = 'path/to/your/previous_hash.txt';
// 원래 해시 값을 얻으십시오(있다면)
$previousHash = file_exists($hashFile) ? file_get_contents($hashFile) : null;
// 현재 파일의 해시 값을 얻으십시오
$file = 'path/to/your/largefile.txt';
$stream = fopen($file, 'rb');
if (!$stream) {
die('无法파일을 엽니 다');
}
$context = hash_init('sha256');
while (!feof($stream)) {
$data = fread($stream, 8192);
hash_update_stream($context, $data);
}
$currentHash = hash_final($context);
fclose($stream);
// 있다면之前的哈希值,비교하십시오
if ($previousHash !== null) {
if ($previousHash === $currentHash) {
echo "파일이 수정되지 않았습니다。\n";
} else {
echo "파일이 수정되었습니다。\n";
}
} else {
echo "이전 해시 값은 발견되지 않았습니다,无法비교하십시오。\n";
}
// 현재 해시 값을 저장하십시오,다음 비교
file_put_contents($hashFile, $currentHash);
?>
이 코드에서는 먼저 파일에서 이전에 저장된 해시 값을 읽으려고합니다. 그런 다음 현재 파일의 해시 값을 다시 계산하고 비교하십시오. 해시 값이 일관된 경우 파일이 변경되지 않았 음을 의미합니다. 다른 경우 파일이 수정되었습니다. 마지막으로, 다음 비교를 위해 현재 해시 값을 파일에 저장합니다.
위의 단계를 통해 Hash_update_stream을 효율적으로 사용하여 큰 파일이 수정되었는지 여부를 감지 할 수 있습니다. 전체 파일을 메모리에 직접로드하는 것과 비교할 때이 방법은 메모리 사용 및 성능에 명백한 장점이 있으며 매우 큰 파일을 처리하는 데 특히 적합합니다.
해시 값 비교를 통해 파일 컨텐츠의 무결성 검사를 구현하여 파일이 변조되거나 손실되지 않도록 할 수 있습니다.
이 기사가 PHP에서 hash_update_stream 함수를 사용하여 대형 파일의 수정을 감지하고 실제 개발에서 파일 관리 효율성을 향상시키는 방법을 이해하는 데 도움이되기를 바랍니다.