현재 위치: > 최신 기사 목록> hash_update_stream ()을 사용하여 큰 파일의 해시를 계산하는 방법

hash_update_stream ()을 사용하여 큰 파일의 해시를 계산하는 방법

M66 2025-05-27

PHP에서는 큰 파일의 해시를 계산해야 할 때 성능 문제가 발생할 수 있습니다. 전체 파일을 한 번에 읽고 해시를 계산하면 특히 파일이 클 때 많은 메모리를 소비하여 메모리 오버플로를 유발할 수 있습니다. 따라서 PHP는 파일의 해시 값을 계산하는 효율적인 방법을 제공하며 Hash_update_stream () 함수는 그 중 하나입니다.

이 기사는 Hash_update_stream () 함수를 사용하여 큰 파일의 해시 값을 효율적으로 계산하고 큰 파일을 처리 할 때 메모리 오버플로 문제가 없는지 확인하는 방법을 소개합니다.

1. hash_update_stream () 함수는 무엇입니까?

hash_update_stream () 함수는 PHP가 해시 값을 업데이트하기 위해 제공하는 함수입니다. 전체 파일에서 해시 알고리즘을 직접 사용하는 것과 달리 Hash_update_stream ()은 블록으로 파일 내용을 읽고 해시 값을 동적으로 업데이트 할 수 있습니다. 이러한 방식으로 프로그램은 전체 파일을 한 번에 메모리에로드하지 않으므로 큰 파일의 해시 값을 계산하는 데 특히 적합합니다.

기능 프로토 타입 :

 bool hash_update_stream ( resource $context , resource $stream , int $length )
  • $ Context : Hash_Init () 함수에 의해 생성 된 해시 컨텍스트입니다.

  • $ stream : 유효한 파일 리소스 핸들이며 해시 값을 계산하는 데 필요한 파일을 나타냅니다.

  • $ 길이 : 시간당 읽기 바이트 수입니다. 일반적으로 효율적인 판독 및 계산을 보장하기 위해 적절한 수의 바이트를 지정하는 것이 좋습니다.

2. 큰 파일의 해시 값을 계산하려면 Hash_update_stream () 함수 사용

1 단계 : 해시 컨텍스트를 초기화합니다

먼저 해시 컨텍스트를 초기화하려면 hash_init ()를 사용해야합니다. 예를 들어 SHA256 알고리즘을 사용하십시오.

 $context = hash_init('sha256');

2 단계 : 파일을 열고 블록으로 블록을 읽습니다.

그런 다음 파일을 열고 파일 내용을 하나씩 읽고 Hash_update_stream () 을 통해 해시 값을 업데이트합니다. 다음은 완전한 코드 예입니다.

 <?php
// 해시 컨텍스트를 초기화합니다
$context = hash_init('sha256');

// 해시 값을 계산하는 데 필요한 큰 파일을 엽니 다
$file = fopen('largefile.txt', 'rb');
if ($file === false) {
    die('파일을 열 수 없습니다');
}

// 시간에 따라 읽는 바이트 수를 설정하십시오
$bufferSize = 8192; // 8KB
while (!feof($file)) {
    // 파일 블록을 읽고 해시 값을 업데이트하십시오.
    $data = fread($file, $bufferSize);
    hash_update_stream($context, $data, strlen($data));
}

// 최종 해시 값을 계산하십시오
$hash = hash_final($context);
fclose($file);

// 출력 파일의 해시 값
echo "파일의 해시 값은입니다:$hash";
?>

이 예에서는 먼저 fopen ()을 사용하여 큰 파일을 열고 fread () 를 통해 블록으로 파일 내용을 블록으로 읽습니다. 데이터 읽기가 해시 업데이트를 위해 hash_update_stream () 함수로 전달 될 때마다.

3 단계 : 해시 값을 계산합니다

파일의 모든 데이터가 처리되면 Hash_Final () 함수를 사용하여 최종 해시 값을 얻습니다.

3. Hash_update_stream () 함수 사용의 장점

큰 파일의 해시 값을 계산하기 위해 hash_update_stream ()을 사용하면 전체 파일을 한 번에 읽는 것보다 다음과 같은 장점이 있습니다.

  • 낮은 메모리 소비 : 파일 컨텐츠는 한 번에 메모리에로드하는 대신 블록별로 블록으로 읽히므로 메모리 사용량을 크게 줄이고 큰 파일을 처리하는 데 적합합니다.

  • 효율적인 컴퓨팅 : 청크 판독을 통해 메모리 문제로 인해 프로그램 충돌없이 대형 파일의 해시 계산을 효율적으로 처리 할 수 ​​있습니다.

  • 유연성 : 각 읽기마다 데이터 블록 크기 ( $ buffersize )를 조정하고 파일 크기와 시스템의 메모리 구성에 따라 최적의 블록 크기를 선택할 수 있습니다.

4. URL 도메인 이름을 대체하기위한 샘플 코드

일부 PHP 프로젝트에서는 파일 경로를 처리하거나 원격 서버에서 파일을 가져와야 할 수도 있습니다. 이 경우 URL에 도메인 이름이 포함 된 경우 도메인 이름을 M66.net 으로 바꿔야 할 수도 있습니다. 다음은 URL을 처리 할 때 도메인 이름을 바꾸는 방법을 보여주는 간단한 코드 예입니다.

 <?php
$url = 'https://www.example.com/file.txt';
$newUrl = preg_replace('/https?:\/\/[^\/]+/', 'https://m66.net', $url);
echo "업데이트URL예:$newUrl";
?>

산출:

 업데이트URL예:https://m66.net/file.txt

이러한 방식으로 URL의 도메인 이름을 쉽게 교체 할 수 있습니다.

5. 요약

이 기사에서는 큰 파일의 해시 값을 효율적으로 계산하기 위해 hash_update_stream () 함수를 사용하는 방법을 설명합니다. 블록별로 파일을 읽고 해시 값을 업데이트함으로써 메모리 오버플로 문제를 일으키지 않고도 큰 파일을 효과적으로 처리 할 수 ​​있습니다. 동시에 URL에서 도메인 이름을 교체하는 간단한 방법도 보여주었습니다.

이 내용이 큰 파일을 처리 할 때 효율성을 향상시키고 일반적인 성능 문제를 피할 수 있기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 두십시오.