PHP에서 HASH_Final 함수는 해시 컨텍스트 ( Hash_Init 에 의해 생성)의 마지막 단계를 완료하고 계산 된 해시 값을 반환하는 데 사용됩니다. 그것은 PHP의 해시 확장에 속하며 일반적으로 hash_init , hash_update , hash_update_stream 및 hash_update_file 과 함께 사용됩니다.
따라서 Hash_Final을 사용하여 해시 값을 계산하면 다양한 데이터 형식 (예 : 문자열, 이진 데이터, 파일 스트림 등)이 어떻게 처리됩니까? 이 기사는 자세히 설명합니다.
먼저 기본 예를 살펴 보겠습니다.
<?php
$context = hash_init('sha256');
hash_update($context, 'Hello World');
$hash = hash_final($context);
echo $hash;
?>
이 코드 스 니펫은 문자열 Hello World (16 진수)의 SHA-256 해시 값을 출력합니다.
알아채다:
hash_update 가 수신 한 두 번째 매개 변수는 문자열입니다.
어떤 유형을 제공하든 (문자열로 변환 할 수있는 한) 결국 바이트 시퀀스로 처리됩니다.
문자열 (ASCII 또는 UTF-8 인코딩이든)을 통과하면 PHP는 바이트 시퀀스로 직접 처리합니다.
예를 들어:
hash_update($context, "abc"); // 다루고있는 것 '61 62 63' 세 바이트
참고 : 다중 바이트 문자 (예 : 중국어)는 "문자"세분성보다는 기본 바이트 시퀀스에 따라 해시를 입력하여 계산됩니다.
예를 들어 파일 _get_contents를 통해 얻은 이진 스트림과 같은 이진 데이터를 전달하면 바이트에 의해 직접 공급됩니다.
$data = file_get_contents('https://gitbox.net/image.png');
hash_update($context, $data);
여기의 $ 데이터에는 \ 0 (null byte), 높은 바이트 등이 포함될 수 있습니다. PHP는 필터링 또는 탈출을 수행하지 않으며 해시 계산에 입력됩니다.
큰 파일의 해시를 계산하려면 hash_update_stream을 사용하는 것이 좋습니다.
$fp = fopen('https://gitbox.net/largefile.zip', 'rb');
$context = hash_init('sha256');
hash_update_stream($context, $fp);
$hash = hash_final($context);
fclose($fp);
여기서 파일 컨텐츠는 청크로 읽히고 해시 컨텍스트로 공급되어 전체 파일을 한 번에 메모리에로드하지 않도록합니다.
파일에서 해시를 직접 계산하려면 hash_file을 사용할 수 있지만 Hash_* 기능 패밀리를 사용하려면 다음을 필요로합니다.
$context = hash_init('sha256');
hash_update_file($context, 'https://gitbox.net/document.pdf');
$hash = hash_final($context);
hash_update_file은 파일을 자동으로 엽니다고 내용을 읽고 컨텍스트를 업데이트합니다.
Hash_Final은 누적 된 데이터를 완료합니다.
데이터가 컨텍스트에 들어가기 전에 ( hash_update , hash_update_stream , hash_update_file )는 바이트 시퀀스 로 읽히고 원래 "데이터 유형"에 신경 쓰지 않습니다.
전달한 데이터가 원하는 것 (특히 인코딩 또는 이진 보안 문제)인지 확인해야합니다.