PHP에서 해시 작업을 처리 할 때 기능 세트 Hash_init () , hash_update () 및 hash_final () 은 매우 강력한 조합입니다. 그들은 큰 파일 또는 청크 데이터를 처리하는 데 적합한 해시 값을 계산하는 스트리밍 (세그먼트) 방법을 제공하며 한 번에 해시 () 함수를 사용하는 것보다 더 효율적입니다.
이 기사는 hash_update () 및 hash_final ()을 올바르게 사용하는 방법을 자세히 설명하고주의를 기울일 것들을 지적합니다.
이 세 가지 기능의 기본 프로세스는 다음과 같습니다.
해시 컨텍스트 초기화 :
$context = hash_init('sha256');
여러 번 업데이트 된 데이터 :
hash_update($context, '데이터의 일부1');
hash_update($context, '데이터의 일부2');
최종 해시 값을 얻으십시오.
$hash = hash_final($context);
Complete example:
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello ');
hash_update($context, 'World!');
$finalHash = hash_final($context);
echo "최종 해시 값: " . $finalHash;
?>
1 ??? hash_final () 이 호출 된 후에 컨텍스트를 다시 사용할 수 없습니다.
전화 할 때 :
$hash = hash_final($context);
컨텍스트 $ 컨텍스트 가 파괴되며 더 이상 hash_update () 또는 hash_final ()을 계속 호출하는 데 사용할 수 없으며, 그렇지 않으면 오류 가보고됩니다.
동일한 데이터 스트림에서 다른 해시를 계속 계산하려면 Hash_Init ()를 다시 호출해야합니다.
2 ?? Hash_copy ()를 분기로 사용하십시오
동일한 컨텍스트를 기반으로 여러 분기 결과를 얻어야하는 경우 hash_copy ()를 사용할 수 있습니다.
$context = hash_init('sha256');
hash_update($context, '데이터의 일부');
$copy = hash_copy($context);
hash_update($context, '후속A');
$hashA = hash_final($context);
hash_update($copy, '후속B');
$hashB = hash_final($copy);
이런 식으로 $ hasha 와 $ hashb는 다른 지점의 결과입니다.
3 ???? 큰 파일을 처리 할 때 블록별로 업데이트하십시오
큰 파일의 경우 청크에서 hash_update ()를 읽고 전화 할 수 있습니다.
<?php
$context = hash_init('sha256');
$handle = fopen('largefile.bin', 'rb');
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "큰 파일 해시 값: " . $finalHash;
?>
이것은 한 번에 파일을 읽음으로써 발생하는 메모리 압력을 피합니다.
4 ?? URL 시나리오에서 사용합니다
예를 들어 HTTP 요청을 통해 데이터를 스트리밍하는 경우 다음과 같습니다.
<?php
$url = 'https://gitbox.net/sample-file.bin';
$context = hash_init('sha256');
$handle = fopen($url, 'rb');
if ($handle) {
while (!feof($handle)) {
$chunk = fread($handle, 8192);
hash_update($context, $chunk);
}
fclose($handle);
$finalHash = hash_final($context);
echo "원격 파일 해시 값: " . $finalHash;
} else {
echo "열 수 없습니다 URL。";
}
?>
조심하십시오 : php.ini 에서 allow_url_fopen이 활성화되어 있는지 확인하십시오. 그렇지 않으면 fopen () 이 URL을 직접 열 수 없습니다.
5 ?? 올바른 알고리즘을 선택하십시오
hash_init () 의 첫 번째 매개 변수는 알고리즘 이름입니다. 오래된 MD5 또는 SHA1 대신 SHA256 및 SHA512 와 같은 최신 알고리즘을 사용하는 것이 좋습니다. 후자는 더 이상 안전하지 않기 때문입니다.