本文目录导读:

MD5/SHA校验(最常用)
Bash脚本示例
#!/bin/bash
# 计算文件MD5值
md5_value=$(md5sum "$1" | cut -d' ' -f1)
echo "MD5: $md5_value"
# 计算文件SHA256值
sha256_value=$(sha256sum "$1" | cut -d' ' -f1)
echo "SHA256: $sha256_value"
# 与预期值比较
expected_md5="d41d8cd98f00b204e9800998ecf8427e"
if [ "$md5_value" = "$expected_md5" ]; then
echo "文件校验通过!"
else
echo "文件校验失败!"
fi
Python脚本示例
import hashlib
import sys
def calculate_hash(filename, algorithm='md5'):
"""计算文件哈希值"""
hash_obj = hashlib.new(algorithm)
with open(filename, 'rb') as f:
# 分块读取大文件
for chunk in iter(lambda: f.read(4096), b''):
hash_obj.update(chunk)
return hash_obj.hexdigest()
# 使用示例
if __name__ == "__main__":
filename = sys.argv[1]
md5 = calculate_hash(filename, 'md5')
sha256 = calculate_hash(filename, 'sha256')
print(f"MD5: {md5}")
print(f"SHA256: {sha256}")
CRC32校验(速度快)
使用Python的zlib
import zlib
import sys
def calculate_crc32(filename):
"""计算文件CRC32值"""
with open(filename, 'rb') as f:
crc = 0
for chunk in iter(lambda: f.read(4096), b''):
crc = zlib.crc32(chunk, crc)
return format(crc & 0xFFFFFFFF, '08x')
# 使用示例
crc32 = calculate_crc32('example.txt')
print(f"CRC32: {crc32}")
文件大小+内容校验
import os
import hashlib
import json
class FileValidator:
"""文件校验器"""
def __init__(self, filepath):
self.filepath = filepath
self.file_info = {}
def check_size(self, expected_size=None):
"""检查文件大小"""
actual_size = os.path.getsize(self.filepath)
self.file_info['size'] = actual_size
if expected_size and actual_size != expected_size:
return False
return True
def check_content(self, algorithm='sha256'):
"""检查文件内容"""
hash_value = hashlib.new(algorithm)
with open(self.filepath, 'rb') as f:
for chunk in iter(lambda: f.read(8192), b''):
hash_value.update(chunk)
self.file_info['hash'] = hash_value.hexdigest()
self.file_info['algorithm'] = algorithm
return self.file_info['hash']
def compare_with_checksum_file(self, checksum_file):
"""与校验文件比较"""
with open(checksum_file, 'r') as f:
expected_data = json.load(f)
self.check_size()
self.check_content(expected_data.get('algorithm', 'sha256'))
return (self.file_info['hash'] == expected_data['hash'] and
self.file_info['size'] == expected_data['size'])
# 使用示例
validator = FileValidator('example.txt')
print(f"文件大小: {validator.check_size()} bytes")
print(f"文件哈希: {validator.check_content('sha256')}")
高级校验脚本(包含多种校验)
#!/bin/bash
# 多功能文件校验脚本
validate_file() {
local file="$1"
local checksum_file="$2"
echo "📁 文件: $file"
# 检查文件是否存在
if [ ! -f "$file" ]; then
echo "❌ 文件不存在!"
return 1
fi
# 获取文件信息
local size=$(stat -c%s "$file")
local mod_time=$(stat -c%y "$file")
echo "📊 文件大小: $size 字节"
echo "🕐 修改时间: $mod_time"
# 计算各种哈希值
echo "🔐 哈希值:"
echo " MD5: $(md5sum "$file" | cut -d' ' -f1)"
echo " SHA1: $(sha1sum "$file" | cut -d' ' -f1)"
echo " SHA256: $(sha256sum "$file" | cut -d' ' -f1)"
# 如果有校验文件,进行比对
if [ -f "$checksum_file" ]; then
echo "📋 与校验文件比对:"
if sha256sum --check "$checksum_file" 2>/dev/null; then
echo "✅ 文件校验通过!"
else
echo "❌ 文件校验失败!"
fi
fi
}
# 生成校验文件
generate_checksum() {
local file="$1"
local output="${2:-checksum.sha256}"
sha256sum "$file" > "$output"
echo "✅ 校验文件已生成: $output"
}
# 主函数
main() {
case "${1:-help}" in
check)
validate_file "$2" "$3"
;;
generate)
generate_checksum "$2" "$3"
;;
help|*)
echo "用法: $0 {check|generate} <文件> [校验文件]"
echo " check <文件> [校验文件] - 校验文件完整性"
echo " generate <文件> [输出文件] - 生成校验文件"
;;
esac
}
main "$@"
批处理校验多个文件
import hashlib
import os
from multiprocessing import Pool
def verify_file(args):
"""验证单个文件的完整性"""
filepath, expected_hash = args
try:
# 计算SHA256
sha256 = hashlib.sha256()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(8192), b''):
sha256.update(chunk)
actual_hash = sha256.hexdigest()
is_valid = actual_hash == expected_hash
return {
'file': filepath,
'expected': expected_hash,
'actual': actual_hash,
'valid': is_valid
}
except Exception as e:
return {
'file': filepath,
'error': str(e),
'valid': False
}
def batch_verify(file_hashes):
"""批量校验文件"""
with Pool(processes=4) as pool:
results = pool.map(verify_file, file_hashes.items())
# 统计结果
passed = sum(1 for r in results if r.get('valid'))
failed = sum(1 for r in results if not r.get('valid'))
print(f"✅ 通过: {passed}, ❌ 失败: {failed}")
# 输出失败的文件
for r in results:
if not r.get('valid'):
print(f" ❌ {r['file']}: {r.get('error', '哈希不匹配')}")
return passed, failed
# 使用示例
file_hashes = {
'file1.txt': 'abc123...',
'file2.txt': 'def456...',
}
batch_verify(file_hashes)
使用建议
- 安全考虑:对于重要文件,建议使用SHA256或更强的哈希算法
- 性能优化:处理大文件时分块读取,避免内存溢出
- 错误处理:添加适当的异常处理,确保文件可读
- 自动化:可以集成到CI/CD流水线中
- 校验文件:将哈希值保存到单独的文件中,便于重复验证
选择哪种方法取决于你的具体需求:
- 需要速度?使用CRC32
- 需要安全?使用SHA256
- 需要兼容?使用MD5(虽然不推荐用于安全场景)