현재 위치: > 최신 기사 목록> hash_file () 대신 hash_update_stream ()을 사용하여 큰 파일 처리의 성능 차이 비교 분석

hash_file () 대신 hash_update_stream ()을 사용하여 큰 파일 처리의 성능 차이 비교 분석

M66 2025-06-05

PHP에서 파일 해시 계산은 일반적으로 데이터 무결성 검증, 파일 중복 제거, 디지털 서명 등과 같은 시나리오에서 사용됩니다. 큰 파일을 처리 할 때 hash_file ()hash_update_stream () 은 일반적인 해시 계산 방법입니다. 두 사람은 비슷한 기능을 가지고 있지만 성능에 약간의 차이가 있습니다. 이 기사는 큰 파일을 처리 할 때이 두 가지 방법 간의 성능 차이를 비교하여 개발자가 응용 프로그램의 효율성을 향상시키기 위해 올바른 기능을 더 잘 선택할 수 있도록 도와줍니다.

1. hash_file () 소개

Hash_File () 함수는 지정된 파일의 해시 값을 직접 계산하는 데 사용됩니다. 구문은 다음과 같습니다.

 string hash_file ( string $algo , string $filename [, bool $binary = false ] )
  • $ Algo : MD5 , SHA256 등과 같은 사용 된 해싱 알고리즘을 지정합니다.

  • $ filename : 파일 경로, 해시 값을 계산하기위한 파일을 나타냅니다.

  • $ binary : true 인 경우 바이너리 해시 값을 반환하십시오. False 인 경우 16 진수 해시 값을 반환하십시오.

예를 들어 파일의 SHA256 해시 값을 계산합니다.

 $fileHash = hash_file('sha256', 'largefile.txt');

Hash_file ()은 전체 파일을 자동으로 읽고 해시 값을 계산하기 때문에 매우 쉬운 방법입니다. 그러나 큰 파일을 처리 할 때 전체 파일을 직접 읽으면 특히 메모리 자원이 제한된 환경에서 메모리 소비가 높아질 수 있습니다.

2. Hash_update_stream () 소개

Hash_file () 과 달리 Hash_update_stream () 은 세그먼트에서 해시 값을 계산하는 방법으로 해시를 계산할 때 파일 내용을 단계별로 읽을 수 있습니다. 전체 파일을 한 번에 메모리에로드 할 필요는 없지만 블록으로 청크를 처리 할 수 ​​있으므로 큰 파일에 특히 유용합니다.

 bool hash_update_stream ( resource $context , string $data [, int $length = 0 ] )
  • $ 컨텍스트 : Hash_Init () 를 통해 생성 된 해시 컨텍스트입니다.

  • $ 데이터 : 계산할 데이터의 일부.

  • $ 길이 : 선택적 매개 변수, 읽을 데이터의 길이를 지정합니다.

큰 파일 해시를 계산하기위한 기본 단계는 다음과 같습니다.

 $hashContext = hash_init('sha256');  // 해시 컨텍스트를 초기화합니다
$handle = fopen('largefile.txt', 'rb');  // 파일을 엽니 다

while (!feof($handle)) {
    $data = fread($handle, 8192);  // 청크로 파일을 읽습니다
    hash_update_stream($hashContext, $data);  // 해시 업데이트
}

$hash = hash_final($hashContext);  // 최종 해시 값을 얻으십시오
fclose($handle);

청크로 파일을 읽고 해시 값을 점진적으로 업데이트 함으로써이 방법은 메모리를보다 효과적으로 관리 할 수 ​​있으며 큰 파일을 처리하는 데 적합합니다.

3. 성능 차이 분석

3.1 메모리 사용

  • hash_file () :이 함수는 파일 크기가 중간 정도 인 상황에 적합한 해시 계산을 위해 전체 파일을 한 번에 메모리에로드합니다. 파일이 매우 크면 (예 : 여러 GB와 같은) 메모리 사용이 발생하고 메모리 오버 플로우 오류가 발생합니다.

  • hash_update_stream () :이 메소드는 파일을 단계별로 읽고 해시 값을 업데이트하여 메모리 사용량이 더 낮습니다. 큰 파일의 경우 Hash_update_stream ()은 각각의 읽기 파일 블록에만 데이터를 저장하므로 전체 파일을로드하는 높은 메모리 요구 사항을 피하기 때문에 더 많은 장점이 있습니다.

3.2 속도 차이

속도 측면에서 Hash_file ()은 일반적으로 추가 메모리 할당 또는 처리없이 운영 체제의 파일 판독 기능을 직접 호출하는 기본 기능이기 때문에 성능이 향상됩니다. 그러나 파일 크기가 증가함에 따라 성능은 메모리 제한의 영향을받을 수 있습니다.

대조적으로, Hash_update_stream ()은 더 많은 코드 실행 로직 (예 : 청크 읽기 및 HASH의 점진적 업데이트)이 필요하지만 대규모 파일을 처리 할 때는보다 효율적인 메모리 관리로 인해 전반적인 성능이 더 나은 경향이 있습니다.

3.3 유연성

hash_update_stream ()은 더 많은 유연성을 제공합니다. 개발자는 각 읽기 파일의 크기 ( Fread () 에 의해 지정 됨)의 크기를 제어하여 메모리 풋 프린트와 속도 사이의 균형을 찾을 수 있습니다. 큰 파일의 경우, 성능을 최적화하기 위해 서버의 메모리에 따라 읽기 블록의 크기를 조정할 수 있습니다.

3.4 실제 응용 시나리오

  • 사용 hash_file () : 처리 된 파일이 작고 시스템 메모리가 충분하면 hash_file ()가 더 간결하고 효율적입니다.

  • Hash_update_stream ( )

4. 성능 테스트

둘 사이의 성능 차이를 더 확인하기 위해 간단한 코드로 테스트 할 수 있습니다.

4.1 hash_file () 로 테스트

 $start = microtime(true);
$hash = hash_file('sha256', 'largefile.txt');
$end = microtime(true);
echo "hash_file took: " . ($end - $start) . " seconds.\n";

4.2 hash_update_stream () 로 테스트

 $start = microtime(true);
$hashContext = hash_init('sha256');
$handle = fopen('largefile.txt', 'rb');
while (!feof($handle)) {
    $data = fread($handle, 8192);
    hash_update_stream($hashContext, $data);
}
$hash = hash_final($hashContext);
fclose($handle);
$end = microtime(true);
echo "hash_update_stream took: " . ($end - $start) . " seconds.\n";

두 코드의 실행 시간을 비교함으로써 실제 시나리오에서 두 가지 메소드 간의 성능 차이를 직관적으로 이해할 수 있습니다.

5. 요약

  • 중소형 파일의 경우 Hash_File () 은 간단하고 사용하기 쉽고 빠르며 대부분의 요구를 충족하기에 충분합니다.

  • 대형 파일의 경우 Hash_update_stream ()은 메모리 제어가 향상되며 메모리 제약 환경에서 사용하기에 적합합니다.

올바른 해싱 방법을 선택하면 성능을 향상시킬뿐만 아니라 자원 낭비를 피할 수 있습니다. 대규모 파일 처리의 경우 메모리 풋 프린트가 낮고 안정적인 성능을 갖기 때문에 hash_update_stream ()을 사용하는 것이 좋습니다.