현재 위치: > 최신 기사 목록> 대형 파일을 처리 할 때 Hash_update의 성능을 최적화하는 방법은 무엇입니까?

대형 파일을 처리 할 때 Hash_update의 성능을 최적화하는 방법은 무엇입니까?

gitbox 2025-06-07

큰 파일을 처리 할 때 PHP의 HASH_UPDATE 기능은 종종 MD5, SHA-1 및보다 안전한 SHA-256과 같은 해시 값 계산과 같은 파일 컨텐츠를 해시하는 데 사용됩니다. 그러나 hash_update를 직접 사용하면 대형 파일의 성능 병목 현상이 발생할 수 있으며, 주로 메모리 소비 또는 느린 컴퓨팅 속도로 나타납니다. 이 기사는 샘플 코드를 사용하여 Hash_update 의 성능을 향상시키는 몇 가지 효과적인 방법을 살펴 봅니다.


1. 청크를 사용하여 파일을 읽으려면 한 번에로드를 피하십시오.

전체 파일을 메모리로 직접 읽은 다음 해시로 인해 메모리 오버플로 또는 비 효율성이 발생할 수 있습니다. 모범 사례는 청크 된 읽기 방법을 사용하여 데이터를 hash_update 에 점차 전달하는 것입니다.

 <?php
$filename = '/path/to/large/file.zip';
$context = hash_init('sha256');

$handle = fopen($filename, 'rb');
if ($handle === false) {
    die('Failed to open file');
}

while (!feof($handle)) {
    $buffer = fread($handle, 8192);  // 8KB 각각 읽습니다
    hash_update($context, $buffer);
}

fclose($handle);

$hash = hash_final($context);
echo "File hash: $hash\n";
?>

여기서는 8KB 버퍼 크기가 사용되며 시스템 메모리 및 IO 성능에 따라 조정할 수 있습니다.


2. 적절한 버퍼 크기를 선택하십시오

버퍼 크기는 읽기 및 쓰기 성능에 직접적인 영향을 미칩니다. 너무 작 으면 많은 양의 IO 작업이 발생하고 너무 커지면 너무 많은 메모리가 필요합니다. 일반적으로 8KB ~ 64KB가 좋은 선택입니다. 최고의 성능은 Fread 의 두 번째 매개 변수를 조정하여 테스트 할 수 있습니다.


3. PHP 내장 기능 Hash_file을 사용하여 최적화 (지원되는 경우)

PHP와 함께 제공되는 Hash_File 함수는 일반적으로 PHP 스크립트의 블록별로 읽기 블록보다 기본 구현에서 더 효율적입니다. 해시 값을 간단히 계산하는 경우 직접 사용을 고려할 수 있습니다.

 <?php
$hash = hash_file('sha256', '/path/to/large/file.zip');
echo "File hash: $hash\n";
?>

이 방법은 파일 포인터를 직접 관리 할 필요가 없으며 성능이 향상됩니다.


4. 병렬 처리 (멀티 스레드/다중 프로세스)

환경에서 허용되면 파일을 여러 부품으로 분할하고 여러 프로세스 또는 여러 스레드를 사용하여 각 부품의 해시를 별도로 계산하고 결과 (예 : 부분 해시를 사용자 정의하거나 병합하는 것)를 병합 할 수 있습니다. PHP는 기본적으로 멀티 스레딩을 지원하지 않지만 PCNTL_FORK 또는 외부 확장으로 구현할 수 있습니다.

그러나이 솔루션은 복잡하며 해싱 알고리즘 구현에 대한 특별한 요구 사항이 있으며 일반적으로 특히 큰 파일 및 특수 시나리오에 적합합니다.


5. 반복 계산을 피하고 캐싱 메커니즘을 사용하십시오

파일이 자주 변경되지 않으면 파일의 해시 값을 캐시하여 반복 계산을 줄일 수 있습니다.

예를 들어, 파일의 마지막 수정 시간과 해시 값을 먼저 저장하십시오.

 <?php
$filename = '/path/to/large/file.zip';
$cacheFile = '/tmp/file_hash_cache.json';

$cache = json_decode(file_get_contents($cacheFile) ?: '{}', true);
$filemtime = filemtime($filename);

if (isset($cache[$filename]) && $cache[$filename]['mtime'] === $filemtime) {
    $hash = $cache[$filename]['hash'];
} else {
    $hash = hash_file('sha256', $filename);
    $cache[$filename] = ['mtime' => $filemtime, 'hash' => $hash];
    file_put_contents($cacheFile, json_encode($cache));
}

echo "File hash: $hash\n";
?>

이것은 매번 해시를 다시 계산하는 것을 피합니다.


6. 적절한 해싱 알고리즘을 사용하십시오

다양한 해싱 알고리즘의 성능은 크게 다릅니다. MD5 및 SHA-1은 일반적으로 SHA-256보다 빠르지 만 덜 안전합니다. 시나리오 트레이드 오프 속도 및 보안 요구에 따라 적절한 알고리즘을 선택하십시오.


요약

  • 블록 읽기 : 한 번에 메모리에 대한 읽기를 피하고 블록 읽기를 사용하고 hash_update 에 전화하십시오.

  • 버퍼 크기 조정 : IO 성능을 향상시키기 위해 버퍼 크기를 합리적으로 선택하십시오.

  • HASH_FILE 기능 사용 : PHP HASH 파일 기능 HASH 파일 기능이 뛰어납니다.

  • 병렬 처리 : 초대형 파일에 대한 다중 프로세스 샤드 계산을 시도 할 수 있습니다.

  • 캐시 해시 결과 : 변경되지 않은 파일의 반복 계산을 피하십시오.

  • 올바른 알고리즘을 선택하십시오 . 속도 및 보안 트레이드 오프를 기반으로 해시 알고리즘을 선택하십시오.

이러한 기술을 마스터하면 큰 파일 해시를 처리 할 때 PHP 프로그램의 성능을 크게 향상시킬 수 있습니다.


 <?php
// 샘플 코드:청크로 파일을 읽고 사용하십시오 hash_update 믿다 SHA-256
$filename = 'https://gitbox.net/path/to/large/file.zip';
$context = hash_init('sha256');

$handle = fopen($filename, 'rb');
if ($handle === false) {
    die('Failed to open file');
}

while (!feof($handle)) {
    $buffer = fread($handle, 65536);  // 64KB
    hash_update($context, $buffer);
}

fclose($handle);

$hash = hash_final($context);
echo "File hash: $hash\n";
?>