현재 위치: > 최신 기사 목록> PHP에서 hash_final에서 hash 빅 데이터를 사용하는 방법은 무엇입니까?

PHP에서 hash_final에서 hash 빅 데이터를 사용하는 방법은 무엇입니까?

gitbox 2025-05-20

큰 파일 또는 대량의 데이터를 처리 할 때 전통적인 일회성 해싱 방법은 종종 과도한 메모리 사용 또는 성능 저하와 같은 문제에 직면합니다. 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 피드백 또는 로그 집계 시스템을 처리하는 데 특히 적합합니다.

주목해야 할 것

  1. 인코딩 일관성 : Hash_update () 에 전달 된 데이터가 일관되게 인코딩되어 있는지 확인하고 다중 바이트 문자가 다른 해시 값을 유발하지 않도록하십시오.

  2. 오류 처리 : 파일 읽기 실패, 네트워크 오류 등에 대한 예외를 완전히 처리합니다.

  3. 해시 알고리즘 선택 : SHA256 , SHA512 , MD5 와 같은 실제 보안 요구에 따라 적절한 해시 알고리즘을 선택하십시오 (보안 시나리오에는 권장되지 않음) 등이 있습니다.

결론

Hash_init ()Hash_update () 와 결합 된 Hash_final ()을 통해 PHP는 빅 데이터의 해시 컴퓨팅을 처리하는 효율적이고 낮은 리소스 소비 방법을 제공합니다. 파일 확인 또는 스트리밍 데이터 분석이든,이 메커니즘을 마스터하면 데이터 처리 능력이 크게 향상 될 수 있습니다.