큰 파일로 작업 할 때 전체 파일을 직접 읽고 해시 값을 계산하면 메모리 사용이 과도하게 사용될 수 있으며 메모리가 불충분 할 때 프로그램 충돌도 발생시킬 수 있습니다. 이 문제를 해결하기 위해 PHP의 Hash_update_stream 함수를 사용하여 청크에서 파일을 읽고 실시간으로 해시 값을 계산할 수 있습니다. 다음은 청크에서 파일을 읽고 파일의 해시 값을 계산하여 전체 파일을 한 번에로드하지 않도록하는 방법을 보여주는 예입니다.
hash_update_stream 함수는 스트리밍 업데이트 해시 값을 위해 PHP에서 제공하는 함수입니다. hash_update () 함수와 달리 Hash_update_stream은 파일 스트림 ( Resource )을 통해 블록별로 해시 값을 업데이트하며, 이는 큰 파일을 처리하는 데 적합합니다.
파일 스트림을 엽니 다.
hash_init 함수를 사용하여 해시 알고리즘을 초기화하십시오.
hash_update_stream을 사용하여 청크로 파일을 읽고 실시간으로 해시 값을 계산하십시오.
완료되면 파일 스트림을 닫고 최종 해시 값을 얻으십시오.
<?php
// 초기화 해싱 알고리즘,여기에 사용됩니다SHA-256
$hashAlgorithm = 'sha256';
// 파일 스트림을 엽니 다
$filePath = 'path_to_your_large_file'; // 파일 경로로 교체하십시오
$fileStream = fopen($filePath, 'rb');
if (!$fileStream) {
die("파일을 열 수 없습니다");
}
// 해시 계산 초기화
$hashContext = hash_init($hashAlgorithm);
// 블록 크기를 설정하십시오,대개 8KB 또는 16KB
$chunkSize = 8192; // 8KB
// 파일을 읽고 실시간으로 해시 값을 업데이트하십시오.
while (!feof($fileStream)) {
$data = fread($fileStream, $chunkSize);
hash_update_stream($hashContext, $data);
}
// 최종 해시 값을 얻으십시오
$fileHash = hash_final($hashContext);
// 출력 파일의 해시 값
echo "파일의 해시 값은입니다: " . $fileHash . "\n";
// 파일 스트림을 닫습니다
fclose($fileStream);
?>
파일 스트림 <br> Fopen 함수를 사용하여 파일을 열고 이진 모드 ( RB )로 읽도록 지정하십시오. 이는 파일 인코딩 또는 줄 중단으로 인해 읽기 컨텐츠가 문제를 일으키지 않도록하기위한 것입니다.
초기화 해싱 알고리즘
Hash_init ()는 해시 알고리즘을 초기화하고 선택한 해시 알고리즘 ( SHA256 , MD5 등)을 전달하는 데 사용됩니다. 이것은 해시 값을 단계별로 계산하기위한 해시 컨텍스트를 만듭니다.
파일을 읽고 해시를 업데이트하십시오 Fread를 사용하여 매번 고정 크기 파일 청크 (예 : 8KB)를 읽으십시오. 그런 다음 hash_update_stream을 사용하여 읽기 데이터 블록을 해시 컨텍스트로 실시간으로 업데이트하십시오.
최종 해시 값을 얻으십시오 <br> Hash_Final () 함수를 사용하여 최종 계산 된 해시 값을 얻고 파일 스트림을 닫으십시오.
큰 파일 해시 계산 <br> 큰 파일 (예 : 1GB보다 큰 파일)을 처리 할 때 파일을 한 번에 메모리에로드 할 수 없습니다. 현재 청크로 파일을 읽고 해시 값을 계산하면 메모리 사용량을 효과적으로 줄일 수 있습니다.
파일 무결성 검증 <br> 파일 내용이 전송 중에 파일의 내용이 변조되지 않도록 해야하는 시나리오의 경우 해시 값을 통해 파일의 무결성을 확인하는 것이 매우 중요합니다.
블록 크기 <br>을 동적으로 조정하십시오 읽기 블록의 크기는 시스템의 메모리 및 디스크 성능에 따라 조정할 수 있습니다. 적절한 블록 크기를 선택하면 성능을 더욱 향상시킬 수 있습니다.
멀티 스레드 처리 <br> 매우 큰 파일의 경우 멀티 스레딩 기술을 사용하여 파일의 다른 부분을 동시에 처리하여 효율성을 더욱 향상시키는 것을 고려할 수 있습니다.
파일이 너무 커서 메모리가 충분하지 않습니다 . <br> 스트리밍을 사용하여 파일을 읽고 청크로 해시 값 청크를 업데이트 할 때 파일 자체가 메모리에 완전히로드되지 않으므로 메모리 오버플로 문제를 피합니다.
Hash_update_stream 함수 <br>에서 지원하지 않는 파일 형식 이 기능은 이진 데이터 스트림을 처리하므로 텍스트 파일, 사진, 비디오 등을 포함하여 모든 유형의 파일을 처리하는 데 사용할 수 있습니다.