Hash_update 의 사용은 다음과 같습니다.
$ctx = hash_init('sha256'); // 해시 컨텍스트를 초기화합니다,알고리즘을 지정합니다
hash_update($ctx, $dataChunk); // 데이터 블록을 추가하십시오
$hash = hash_final($ctx); // 최종 해시 값을 계산하십시오
이 프로세스를 사용하면 Hash_Update를 여러 번 호출하고 매번 데이터의 일부를 추가하고 마지막으로 Hash_Final을 호출하여 전체 데이터의 해시를 출력 할 수 있습니다.
많은 오류는 들어오는 $ datachunk 인코딩 형식으로 인해 발생합니다. 예를 들어 일부는 UTF-8, 그 일부는 GBK 또는 보이지 않는 문자 (BOM)입니다. 이 경우 데이터의 실제 바이트가 일치하지 않기 때문에 해시 결과는 일치하지 않습니다.
예:
$data1 = "안녕하세요"; // UTF-8인코딩 된 문자열
$data2 = mb_convert_encoding($data1, 'GBK'); // 변환GBK코딩
hash_update($ctx, $data1);
hash_update($ctx, $data2); // 두 번 전달 된 데이터의 실제 바이트는 다릅니다.,해시 결과가 잘못되었습니다
솔루션 : 모든 데이터가 일관되게 인코딩되고 순수한 바이너리 스트링이거나 먼저 트랜스 코딩 된 다음 전달되는지 확인하십시오.
청크에서 데이터를 읽을 때 오프셋 오류 또는 잘림이 발생하면 들어오는 블록은 일부 바이트 또는 중복 바이트를 잃어 버려 전체 해시가 잘못 될 수 있습니다.
예를 들어, 파일은 읽을 때 예상대로 청킹되지 않습니다.
while (!feof($fp)) {
$chunk = fread($fp, 1024);
hash_update($ctx, $chunk);
}
비표준 읽기가 사용되거나 버퍼 크기가 잘못 사용되면 데이터 손실이 발생합니다.
솔루션 : 블록이 매번 읽는 블록이 올바른 크기이고 데이터가 누락되지 않았는지 확인하십시오. 표준 파일 읽기 및 쓰기 프로세스를 사용하는 것이 좋습니다.
일부 개발자는 실수로 루프 내부의 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);
위의 문제를 요약하기 위해 Hash_update를 올바르게 사용하기위한 제안은 다음과 같습니다.
통합 데이터 인코딩 : 다국어 또는 다중 소스 데이터를 처리 할 때 데이터를 동일한 인코딩 (예 : UTF-8)으로 변환하여 보이지 않는 문자를 피하십시오.
합리적인 청킹 읽기 : 큰 파일 또는 스트림을 읽을 때 고정 블록을 사용하여 누락이나 복제를 피하십시오.
컨텍스트를 한 번만 초기화하십시오 . Hash_Init을 호출하기 전에 데이터를 처리하기 시작하기 전에 데이터를 여러 번 사용하기 전에 hash_final을 한 번 호출하십시오.
부분 해시 결과를 얻으려면 중간에서 hash_final을 호출하지 마십시오 .
다음 예제는 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;
?>
이 방법은 다음을 보장합니다.
파일은 이진 안전 모드로 열려 변환을 인코딩하여 발생하는 간섭을 피합니다.
누락없이 고정 크기로 청크의 데이터를 읽으십시오.
해시 컨텍스트는 한 번만 초기화되며 결과는 한 번 출력됩니다.
Hash_update 는 PHP가 스트리밍 해시 계산을 수행하는 데 중요한 기능이지만 데이터 길이 또는 인코딩이 일치하지 않으면 최종 해시 오류가 발생합니다. 인코딩이 균일한지 확인하고 데이터가 올바르게 중단되고 해시 컨텍스트가 한 번만 초기화되며 가장 일반적인 문제를 피할 수 있고 원하는 해시 값이 올바르게 얻어집니다.
해시 결과를 제외하고 먼저 확인하십시오.
데이터가 수정되었거나 잘린지 여부
인코딩이 일관성이 있습니까?
해시 컨텍스트는 오류로 재설정됩니다
나는 당신에게 원활한 개발과 올바른 해시 계산을 기원합니다!