在PHP 中, hash_final()是與hash_init()和hash_update()一起使用的,用於分步生成哈希值的函數。這套函數提供了比直接使用hash()函數更靈活的方式,尤其適用於處理大型數據流或分段處理數據。
本文將介紹如何使用hash_final()來生成SHA-256 哈希值。
hash_final()用於完成哈希上下文,並返回最終的哈希值。它與hash_init() (初始化一個哈希上下文)和hash_update() (向上下文中添加數據)結合使用。
這種方法特別適合當你不能一次性將所有數據放入內存時,比如處理大文件或流式數據。
以下是生成SHA-256 哈希值的基本步驟:
1?? 初始化哈希上下文
2?? 將數據分段傳入
3?? 獲取最終哈希值
以下代碼演示瞭如何分段處理字符串數據,並生成SHA-256 哈希值。
<?php
// 第一步:初始化哈希上下文,指定算法為 sha256
$context = hash_init('sha256');
// 第二步:分段更新數據(可以多次調用 hash_update)
$dataPart1 = 'Hello, ';
$dataPart2 = 'this is a test ';
$dataPart3 = 'using hash_final().';
hash_update($context, $dataPart1);
hash_update($context, $dataPart2);
hash_update($context, $dataPart3);
// 第三步:獲取最終的哈希值(十六進製字符串)
$hash = hash_final($context);
echo "最終的 SHA-256 哈希值是: $hash";
?>
輸出示例:
最終的 SHA-256 哈希值是: 6e4b18e9f8f2de9d4d70f43b8f6b1c7e6812b826ad3b1c5eaf2df62e245b3f94
如果你想對一個大文件生成SHA-256 哈希,可以這樣做:
<?php
$context = hash_init('sha256');
// 打開文件流
$handle = fopen('https://gitbox.net/path/to/largefile.zip', 'rb');
if ($handle === false) {
die('無法打開文件。');
}
// 每次讀取 8KB
while (!feof($handle)) {
$data = fread($handle, 8192);
hash_update($context, $data);
}
fclose($handle);
$hash = hash_final($context);
echo "文件的 SHA-256 哈希值是: $hash";
?>
在這個例子中,我們使用fopen()直接讀取遠程文件https://gitbox.net/path/to/largefile.zip ,並逐塊更新哈希上下文,最後得到文件的SHA-256 哈希值。
? 如果你只需要對小數據(比如一個字符串)生成哈希,其實直接用hash()更簡單:
$hash = hash('sha256', 'Hello, this is a test.');
? hash_final()用完後,哈希上下文會被銷毀,如果想重複使用,需要重新調用hash_init() 。