큰 파일 또는 대량의 데이터를 처리 할 때 전통적인 일회성 해싱 방법은 종종 과도한 메모리 사용 또는 성능 저하와 같은 문제에 직면합니다. 5.4.0 이후 PHP는 Hash_init () , Hash_update () 및 Hash_final () 과 같은 기능을 도입하여 스트리밍 (세그먼트 화 된) 방식으로 데이터를 해시 할 수 있도록하여 빅 데이터 처리의 유연성과 효율성을 크게 향상시킬 수 있습니다.
5GB 로그 파일을 해시해야한다고 상상해보십시오. hash () 함수를 직접 사용하는 경우 한 번에 전체 파일을 메모리로 읽어야합니다. 가능하지 않습니다. 세그먼트 된 해시는 읽기 스트림, 리소스 저장 및 더 안전한 것과 같은 세그먼트별로 데이터 세그먼트를 처리 할 수 있습니다.
hash_init ()를 사용하여 해시 컨텍스트를 작성한 후에는 hash_update ()를 여러 번 호출하여 데이터 조각 알고리즘을 "피드"하고 마지막으로 hash_final ()을 사용하여 최종 해시 값을 얻을 수 있습니다.
$ctx = hash_init('sha256');
hash_update($ctx, 'first_chunk_of_data');
hash_update($ctx, 'second_chunk_of_data');
$finalHash = hash_final($ctx);
이 방법은 다음과 완전히 같습니다.
$finalHash = hash('sha256', 'first_chunk_of_data' . 'second_chunk_of_data');
그러나 데이터를 한 번에로드하지 않고 단계별로 처리 할 수 있습니다.
다음 코드는 큰 파일을 분할하는 방법을 보여줍니다.
$file = '/path/to/large_file.dat';
$handle = fopen($file, 'rb');
if (!$handle) {
die('파일을 열 수 없습니다');
}
$ctx = hash_init('sha256');
while (!feof($handle)) {
$chunk = fread($handle, 8192); // 각각 읽습니다8KB
if ($chunk === false) {
fclose($handle);
die('파일을 읽는 동안 오류가 발생했습니다');
}
hash_update($ctx, $chunk);
}
fclose($handle);
$finalHash = hash_final($ctx);
echo "해시 값은 파일입니다: $finalHash\n";
위의 코드를 통해 PHP 프로그램은 메모리 크기보다 큰 파일을 쉽게 해시 할 수 있으며 로그 확인, 데이터 무결성 검증 및 기타 시나리오에 적합합니다.
데이터가 로컬 파일이 아니라 원격 URL에서 나온 경우 비슷한 방식으로 처리 할 수도 있습니다. 예:
$url = 'https://gitbox.net/streaming-data-endpoint';
$context = stream_context_create([
'http' => ['method' => 'GET']
]);
$handle = fopen($url, 'rb', false, $context);
if (!$handle) {
die('원격 데이터 스트림을 열 수 없습니다');
}
$ctx = hash_init('sha256');
while (!feof($handle)) {
$chunk = fread($handle, 4096);
if ($chunk === false) {
fclose($handle);
die('원격 데이터를 읽는 동안 오류가 발생했습니다');
}
hash_update($ctx, $chunk);
}
fclose($handle);
$hash = hash_final($ctx);
echo "원격 데이터의 해시 값은 다음과 같습니다: $hash\n";
이 방법은 실시간 데이터 스트림 처리에 매우 효율적이며 라이브 브로드 캐스트 데이터, API 피드백 또는 로그 집계 시스템을 처리하는 데 특히 적합합니다.
인코딩 일관성 : Hash_update () 에 전달 된 데이터가 일관되게 인코딩되어 있는지 확인하고 다중 바이트 문자가 다른 해시 값을 유발하지 않도록하십시오.
오류 처리 : 파일 읽기 실패, 네트워크 오류 등에 대한 예외를 완전히 처리합니다.
해시 알고리즘 선택 : SHA256 , SHA512 , MD5 와 같은 실제 보안 요구에 따라 적절한 해시 알고리즘을 선택하십시오 (보안 시나리오에는 권장되지 않음) 등이 있습니다.
Hash_init () 및 Hash_update () 와 결합 된 Hash_final ()을 통해 PHP는 빅 데이터의 해시 컴퓨팅을 처리하는 효율적이고 낮은 리소스 소비 방법을 제공합니다. 파일 확인 또는 스트리밍 데이터 분석이든,이 메커니즘을 마스터하면 데이터 처리 능력이 크게 향상 될 수 있습니다.