本文目录导读:

在PHP中计算文件哈希值,可以使用内置的哈希函数,以下是几种常用方法:
使用 hash_file() 函数(推荐)
这是最简单直接的方法:
<?php
// 计算文件的MD5哈希
$md5 = hash_file('md5', 'path/to/your/file.txt');
echo "MD5: " . $md5 . "\n";
// 计算文件的SHA1哈希
$sha1 = hash_file('sha1', 'path/to/your/file.txt');
echo "SHA1: " . $sha1 . "\n";
// 计算文件的SHA256哈希
$sha256 = hash_file('sha256', 'path/to/your/file.txt');
echo "SHA256: " . $sha256 . "\n";
?>
使用 md5_file() 和 sha1_file() 函数
<?php
// 计算文件的MD5
$md5 = md5_file('path/to/your/file.txt');
echo "MD5: " . $md5 . "\n";
// 计算文件的SHA1
$sha1 = sha1_file('path/to/your/file.txt');
echo "SHA1: " . $sha1 . "\n";
?>
使用流式方法(适用于大文件)
对于大文件,建议使用流式方式:
<?php
function calculateFileHash($filepath, $algorithm = 'sha256') {
if (!file_exists($filepath)) {
return false;
}
$hashContext = hash_init($algorithm);
$handle = fopen($filepath, 'rb');
if ($handle === false) {
return false;
}
// 每次读取1MB数据
while (!feof($handle)) {
$buffer = fread($handle, 1048576);
hash_update($hashContext, $buffer);
}
fclose($handle);
return hash_final($hashContext);
}
// 使用示例
$hash = calculateFileHash('largefile.zip', 'sha256');
echo "SHA256: " . $hash . "\n";
?>
获取支持的所有哈希算法
<?php
// 列出所有支持的哈希算法
$algorithms = hash_algos();
echo "支持的算法:\n";
foreach ($algorithms as $algo) {
echo "- " . $algo . "\n";
}
?>
完整的示例类
<?php
class FileHasher {
/**
* 计算文件的哈希值
*
* @param string $filepath 文件路径
* @param string $algorithm 哈希算法
* @param bool $binaryOutput 是否返回二进制格式
* @return string|false 哈希值或false
*/
public static function hashFile($filepath, $algorithm = 'sha256', $binaryOutput = false) {
if (!file_exists($filepath) || !is_readable($filepath)) {
return false;
}
return hash_file($algorithm, $filepath, $binaryOutput);
}
/**
* 验证文件哈希值
*
* @param string $filepath 文件路径
* @param string $expectedHash 期望的哈希值
* @param string $algorithm 哈希算法
* @return bool 是否匹配
*/
public static function verifyHash($filepath, $expectedHash, $algorithm = 'sha256') {
$actualHash = self::hashFile($filepath, $algorithm);
if ($actualHash === false) {
return false;
}
return hash_equals($expectedHash, $actualHash);
}
}
// 使用示例
$file = 'document.pdf';
// 计算哈希值
$hash = FileHasher::hashFile($file, 'sha256');
echo "文件哈希值: " . $hash . "\n";
// 验证哈希值
$expected = '已知的哈希值...';
$isValid = FileHasher::verifyHash($file, $expected, 'sha256');
echo "验证结果: " . ($isValid ? '有效' : '无效') . "\n";
?>
批量计算文件哈希
<?php
function calculateHashesForFiles($files) {
$results = [];
$algorithms = ['md5', 'sha1', 'sha256'];
foreach ($files as $file) {
$fileHashes = [];
foreach ($algorithms as $algo) {
$fileHashes[$algo] = hash_file($algo, $file);
}
$results[$file] = $fileHashes;
}
return $results;
}
// 使用示例
$files = ['file1.txt', 'file2.jpg', 'file3.pdf'];
$hashes = calculateHashesForFiles($files);
foreach ($hashes as $file => $fileHashes) {
echo "文件: $file\n";
foreach ($fileHashes as $algo => $hash) {
echo " $algo: $hash\n";
}
}
?>
注意事项
- 性能考虑:对于大文件,建议使用流式方法,避免内存溢出
- 安全比较:验证哈希值时使用
hash_equals()防止时序攻击 - 错误处理:始终检查文件是否存在和可读
- 二进制安全:某些算法可能需要二进制输出,使用
true参数
这些方法基本覆盖了PHP中计算文件哈希的所有需求场景。