PHP计算文件哈希值

wen PHP项目 3

本文目录导读:

PHP计算文件哈希值

  1. 使用 hash_file() 函数(推荐)
  2. 使用 md5_file()sha1_file() 函数
  3. 使用流式方法(适用于大文件)
  4. 获取支持的所有哈希算法
  5. 完整的示例类
  6. 批量计算文件哈希
  7. 注意事项

在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";
    }
}
?>

注意事项

  1. 性能考虑:对于大文件,建议使用流式方法,避免内存溢出
  2. 安全比较:验证哈希值时使用 hash_equals() 防止时序攻击
  3. 错误处理:始终检查文件是否存在和可读
  4. 二进制安全:某些算法可能需要二进制输出,使用 true 参数

这些方法基本覆盖了PHP中计算文件哈希的所有需求场景。

抱歉,评论功能暂时关闭!