函數簽名對比
| 函數 | 參數 | 返回值 | 核心用途 |
| md5(string $str, bool $raw = false) | 字符串 | 32 字符十六進制數 / 16 字節二進制 | 字符串完整性校驗、密碼哈希(不推薦)、生成唯一標識 |
| md5_file(string $file, bool $raw = false) | 文件路徑 | 同上 | 文件完整性校驗、斷點續傳驗證、去重、緩存鍵生成 |
代碼示例
<?php
// 字符串哈希
$str = 'hello world';
echo md5($str); // 5eb63bbbe01eeed093cb22bb8f5acdc3
// 文件哈希
$file = 'example.zip';
echo md5_file($file); // d41d8cd98f00b204e9800998ecf8427e
// 進階:流式計算大文件(避免內存溢出)
function md5_file_stream($file) {
$ctx = hash_init('md5');
$fp = fopen($file, 'rb');
while (!feof($fp)) {
hash_update($ctx, fread($fp, 8192));
}
fclose($fp);
return hash_final($ctx);
}
?>
應用場景深度解析
1. 文件上傳秒傳/斷點續傳
<?php
// 客戶端計算文件 MD5,發送給服務端
// 服務端查數據庫是否存在相同 MD5 且大小一致的文件
// 存在 → 直接關聯記錄,秒傳完成
// 不存在 → 分配上傳臨時目錄,支持分片上傳
?>
2. 靜態資源緩存版本控制
<?php
// 模板中
<link href="/css/app.css?v== md5_file('public/css/app.css') ?>" rel="stylesheet">
// 文件修改後 MD5 變化,瀏覽器自動加載新版本
?>
3. 數據同步校驗
<?php
// 主從數據庫同步後,抽樣比對關鍵表導出文件的 MD5
// 一致 → 同步成功;不一致 → 報警人工介入
?>
安全警示
- MD5 已被攻破(碰撞攻擊)**,**嚴禁用於密碼存儲、數字簽名、安全關鍵場景**。
- 密碼請使用
password_hash() (BCrypt/Argon2)。
- 完整性校驗推薦 SHA-256:
hash('sha256', $data)、hash_file('sha256', $file)。
性能提示
md5_file() 內部使用流式讀取,**不會將整個文件載入內存**,大文件安全使用。
- 頻繁計算同一文件 MD5 時,建議緩存結果(如 Redis 存儲
md5:filepath)。