현재 위치: > 최신 기사 목록> 일반적인 오류 : 데이터 길이가 일치하지 않을 때 Php Hash_update를 다루는 방법

일반적인 오류 : 데이터 길이가 일치하지 않을 때 Php Hash_update를 다루는 방법

gitbox 2025-05-29

1. Hash_update 간단한 소개

Hash_update 의 사용은 다음과 같습니다.

 $ctx = hash_init('sha256');     // 해시 컨텍스트를 초기화합니다,알고리즘을 지정합니다
hash_update($ctx, $dataChunk);  // 데이터 블록을 추가하십시오
$hash = hash_final($ctx);        // 최종 해시 값을 계산하십시오

이 프로세스를 사용하면 Hash_Update를 여러 번 호출하고 매번 데이터의 일부를 추가하고 마지막으로 Hash_Final을 호출하여 전체 데이터의 해시를 출력 할 수 있습니다.


2. 일반적인 오류 및 원인 분석

2.1 들어오는 데이터 인코딩은 일치하지 않습니다

많은 오류는 들어오는 $ datachunk 인코딩 형식으로 인해 발생합니다. 예를 들어 일부는 UTF-8, 그 일부는 GBK 또는 보이지 않는 문자 (BOM)입니다. 이 경우 데이터의 실제 바이트가 일치하지 않기 때문에 해시 결과는 일치하지 않습니다.

예:

 $data1 = "안녕하세요";               // UTF-8인코딩 된 문자열
$data2 = mb_convert_encoding($data1, 'GBK'); // 변환GBK코딩
hash_update($ctx, $data1);
hash_update($ctx, $data2);      // 두 번 전달 된 데이터의 실제 바이트는 다릅니다.,해시 결과가 잘못되었습니다

솔루션 : 모든 데이터가 일관되게 인코딩되고 순수한 바이너리 스트링이거나 먼저 트랜스 코딩 된 다음 전달되는지 확인하십시오.


2.2 차단 된 데이터 경계 오류

청크에서 데이터를 읽을 때 오프셋 오류 또는 잘림이 발생하면 들어오는 블록은 일부 바이트 또는 중복 바이트를 잃어 버려 전체 해시가 잘못 될 수 있습니다.

예를 들어, 파일은 읽을 때 예상대로 청킹되지 않습니다.

 while (!feof($fp)) {
    $chunk = fread($fp, 1024);
    hash_update($ctx, $chunk);
}

비표준 읽기가 사용되거나 버퍼 크기가 잘못 사용되면 데이터 손실이 발생합니다.

솔루션 : 블록이 매번 읽는 블록이 올바른 크기이고 데이터가 누락되지 않았는지 확인하십시오. 표준 파일 읽기 및 쓰기 프로세스를 사용하는 것이 좋습니다.


2.3 다중 초기화 또는 오류 재사용 컨텍스트

일부 개발자는 실수로 루프 내부의 Hash_Init을 호출하여 해시 컨텍스트가 재설정되고 해시 값이 일관되지 않도록합니다.

Error example:

 foreach ($dataChunks as $chunk) {
    $ctx = hash_init('sha256');  // 실수:모든 루프를 재설정하십시오
    hash_update($ctx, $chunk);
}
$hash = hash_final($ctx);

이 시점에서 $ CTX는 마지막 블록의 해시 만 저장합니다.

올바른 글쓰기 :

 $ctx = hash_init('sha256');
foreach ($dataChunks as $chunk) {
    hash_update($ctx, $chunk);
}
$hash = hash_final($ctx);

3. hash_update를 올바르게 사용하는 방법

위의 문제를 요약하기 위해 Hash_update를 올바르게 사용하기위한 제안은 다음과 같습니다.

  • 통합 데이터 인코딩 : 다국어 또는 다중 소스 데이터를 처리 할 때 데이터를 동일한 인코딩 (예 : UTF-8)으로 변환하여 보이지 않는 문자를 피하십시오.

  • 합리적인 청킹 읽기 : 큰 파일 또는 스트림을 읽을 때 고정 블록을 사용하여 누락이나 복제를 피하십시오.

  • 컨텍스트를 한 번만 초기화하십시오 . Hash_Init을 호출하기 전에 데이터를 처리하기 시작하기 전에 데이터를 여러 번 사용하기 전에 hash_final을 한 번 호출하십시오.

  • 부분 해시 결과를 얻으려면 중간에서 hash_final을 호출하지 마십시오 .


4. 코드 예제

다음 예제는 hash_update를 사용하여 파일의 SHA256 해시를 올바르게 계산하는 방법을 보여줍니다.

 <?php
$filename = 'gitbox.net/path/to/yourfile.txt';
$ctx = hash_init('sha256');
$fp = fopen($filename, 'rb');
if (!$fp) {
    die('파일을 열 수 없습니다');
}

while (!feof($fp)) {
    $chunk = fread($fp, 8192);  // 8KB블록 읽기
    if ($chunk === false) {
        fclose($fp);
        die('读取문서실수');
    }
    hash_update($ctx, $chunk);
}
fclose($fp);

$hash = hash_final($ctx);
echo "문서SHA256해시 가치: " . $hash;
?>

이 방법은 다음을 보장합니다.

  • 파일은 이진 안전 모드로 열려 변환을 인코딩하여 발생하는 간섭을 피합니다.

  • 누락없이 고정 크기로 청크의 데이터를 읽으십시오.

  • 해시 컨텍스트는 한 번만 초기화되며 결과는 한 번 출력됩니다.


5. 요약

Hash_update 는 PHP가 스트리밍 해시 계산을 수행하는 데 중요한 기능이지만 데이터 길이 또는 인코딩이 일치하지 않으면 최종 해시 오류가 발생합니다. 인코딩이 균일한지 확인하고 데이터가 올바르게 중단되고 해시 컨텍스트가 한 번만 초기화되며 가장 일반적인 문제를 피할 수 있고 원하는 해시 값이 올바르게 얻어집니다.

해시 결과를 제외하고 먼저 확인하십시오.

  • 데이터가 수정되었거나 잘린지 여부

  • 인코딩이 일관성이 있습니까?

  • 해시 컨텍스트는 오류로 재설정됩니다

나는 당신에게 원활한 개발과 올바른 해시 계산을 기원합니다!