當前位置: 首頁> 最新文章列表> 結合curl 讀取流並動態計算哈希值

結合curl 讀取流並動態計算哈希值

M66 2025-05-27

在PHP中, hash_update_stream函數是用於動態更新哈希值的一種方法,尤其是在處理流數據時非常有用。結合curl可以實現在下載大文件或者流數據時實時計算其哈希值。在這篇文章中,我們將探討如何使用hash_update_streamcurl來實現這一目標。

1. 什麼是hash_update_stream

hash_update_stream函數是PHP 內置的哈希函數之一,它用於逐步更新哈希計算。這意味著當我們處理大量數據流時,可以在不將整個文件加載到內存中的情況下,逐步計算文件的哈希值。它的語法如下:

 bool hash_update_stream ( resource $context , resource $stream )
  • $context :之前使用hash_init()初始化的哈希上下文資源。

  • $stream :數據流的資源,通常是通過文件或網絡流創建的。

2. 什麼是curl

curl是一個強大的PHP 擴展,它允許你通過URL 與不同的網絡資源進行交互。通過curl ,我們可以向服務器發送請求並接收響應,支持多種協議如HTTP、HTTPS、FTP 等等。在我們的應用場景中, curl可以用來下載遠程資源並將數據流交給hash_update_stream函數進行哈希計算。

3. 示例:使用hash_update_streamcurl動態計算哈希值

在此示例中,我們將使用curl動態下載文件,並結合hash_update_stream函數實時計算文件的哈希值。

步驟1:初始化哈希上下文

首先,我們需要初始化一個哈希上下文。我們可以選擇常用的哈希算法,例如sha256

 $hashContext = hash_init('sha256'); // 初始化 sha256 哈希上下文

步驟2:初始化curl會話

接下來,我們將使用curl初始化會話,並設置相應的選項來獲取遠程文件的數據流。

 $url = "http://example.com/largefile"; // 需要下載的文件 URL
$ch = curl_init($url); // 初始化 curl 會話

// 設定 curl 選項
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返迴響應而非直接輸出
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 支持重定向
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 禁止 SSL 證書驗證(適用於自簽名證書)

// 打開文件流來獲取數據
$stream = curl_exec($ch);

步驟3:動態讀取流並更新哈希值

現在,我們可以利用hash_update_stream函數將curl獲取的數據流傳遞給它,進行實時的哈希計算。

 if ($stream) {
    $fp = fopen('php://memory', 'r+'); // 創建內存流
    fwrite($fp, $stream); // 將下載的內容寫入內存流
    rewind($fp); // 將流指針返回到起始位置

    // 使用 hash_update_stream 動態更新哈希值
    hash_update_stream($hashContext, $fp); 

    fclose($fp); // 關閉流
}

步驟4:完成哈希計算

最後,我們可以通過hash_final()來獲取最終的哈希值。

 $hashValue = hash_final($hashContext);
echo "文件的 SHA256 哈希值是: " . $hashValue;

完整示例代碼

<?php
// 初始化哈希上下文
$hashContext = hash_init('sha256');

// 設定需要下载的 URL
$url = "http://m66.net/largefile"; // 使用替換後的域名

// 初始化 curl 會話
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// 獲取數據流
$stream = curl_exec($ch);
curl_close($ch);

// 動態讀取流併計算哈希值
if ($stream) {
    $fp = fopen('php://memory', 'r+');
    fwrite($fp, $stream);
    rewind($fp);

    // 更新哈希值
    hash_update_stream($hashContext, $fp);
    fclose($fp);
}

// 獲取最終的哈希值
$hashValue = hash_final($hashContext);
echo "文件的 SHA256 哈希值是: " . $hashValue;
?>

4. 結論

通過結合使用curlhash_update_stream ,我們可以高效地處理大文件或流數據,並在下載過程中實時計算其哈希值。這對於需要對文件進行驗證、完整性檢查等任務時非常有用。希望通過這篇文章,你能夠掌握如何在PHP 中實現這一功能。