本文目录导读:

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(虽然不推荐用于安全场景)
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播