큰 파일을 처리 할 때 PHP의 HASH_UPDATE 기능은 종종 MD5, SHA-1 및보다 안전한 SHA-256과 같은 해시 값 계산과 같은 파일 컨텐츠를 해시하는 데 사용됩니다. 그러나 hash_update를 직접 사용하면 대형 파일의 성능 병목 현상이 발생할 수 있으며, 주로 메모리 소비 또는 느린 컴퓨팅 속도로 나타납니다. 이 기사는 샘플 코드를 사용하여 Hash_update 의 성능을 향상시키는 몇 가지 효과적인 방법을 살펴 봅니다.
전체 파일을 메모리로 직접 읽은 다음 해시로 인해 메모리 오버플로 또는 비 효율성이 발생할 수 있습니다. 모범 사례는 청크 된 읽기 방법을 사용하여 데이터를 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 성능에 따라 조정할 수 있습니다.
버퍼 크기는 읽기 및 쓰기 성능에 직접적인 영향을 미칩니다. 너무 작 으면 많은 양의 IO 작업이 발생하고 너무 커지면 너무 많은 메모리가 필요합니다. 일반적으로 8KB ~ 64KB가 좋은 선택입니다. 최고의 성능은 Fread 의 두 번째 매개 변수를 조정하여 테스트 할 수 있습니다.
PHP와 함께 제공되는 Hash_File 함수는 일반적으로 PHP 스크립트의 블록별로 읽기 블록보다 기본 구현에서 더 효율적입니다. 해시 값을 간단히 계산하는 경우 직접 사용을 고려할 수 있습니다.
<?php
$hash = hash_file('sha256', '/path/to/large/file.zip');
echo "File hash: $hash\n";
?>
이 방법은 파일 포인터를 직접 관리 할 필요가 없으며 성능이 향상됩니다.
환경에서 허용되면 파일을 여러 부품으로 분할하고 여러 프로세스 또는 여러 스레드를 사용하여 각 부품의 해시를 별도로 계산하고 결과 (예 : 부분 해시를 사용자 정의하거나 병합하는 것)를 병합 할 수 있습니다. PHP는 기본적으로 멀티 스레딩을 지원하지 않지만 PCNTL_FORK 또는 외부 확장으로 구현할 수 있습니다.
그러나이 솔루션은 복잡하며 해싱 알고리즘 구현에 대한 특별한 요구 사항이 있으며 일반적으로 특히 큰 파일 및 특수 시나리오에 적합합니다.
파일이 자주 변경되지 않으면 파일의 해시 값을 캐시하여 반복 계산을 줄일 수 있습니다.
예를 들어, 파일의 마지막 수정 시간과 해시 값을 먼저 저장하십시오.
<?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";
?>
이것은 매번 해시를 다시 계산하는 것을 피합니다.
다양한 해싱 알고리즘의 성능은 크게 다릅니다. 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";
?>