| import hashlib
|
| from pathlib import Path
|
|
|
|
|
| def compute_sha256(file_path, expected_hash=None, chunk_size=8192):
|
| """
|
| Compute the SHA256 hash of a file and optionally verify it.
|
|
|
| Args:
|
| file_path (str or Path): Path to the file to hash
|
| expected_hash (str, optional): Expected SHA256 hash to verify against
|
| chunk_size (int): Size of chunks to read (default 8KB for memory efficiency)
|
|
|
| Returns:
|
| str: The computed SHA256 hash (lowercase hexadecimal)
|
|
|
| Raises:
|
| FileNotFoundError: If the file doesn't exist
|
| ValueError: If expected_hash is provided and doesn't match
|
|
|
| Example:
|
| >>> # Just compute the hash
|
| >>> hash_value = compute_sha256("model.bin")
|
| >>> print(f"SHA256: {hash_value}")
|
|
|
| >>> # Compute and verify
|
| >>> try:
|
| >>> hash_value = compute_sha256("model.bin",
|
| >>> expected_hash="abc123...")
|
| >>> print("File verified successfully!")
|
| >>> except ValueError as e:
|
| >>> print(f"Verification failed: {e}")
|
| """
|
| file_path = Path(file_path)
|
|
|
| if not file_path.exists():
|
| raise FileNotFoundError(f"File not found: {file_path}")
|
|
|
|
|
| sha256_hash = hashlib.sha256()
|
|
|
|
|
| with open(file_path, "rb") as f:
|
| while chunk := f.read(chunk_size):
|
| sha256_hash.update(chunk)
|
|
|
|
|
| computed_hash = sha256_hash.hexdigest()
|
|
|
|
|
| if expected_hash is not None:
|
| expected_hash = expected_hash.lower().strip()
|
| if computed_hash != expected_hash:
|
| raise ValueError(
|
| f"Hash mismatch!\n"
|
| f"Expected: {expected_hash}\n"
|
| f"Computed: {computed_hash}"
|
| )
|
| print(f"✓ Hash verified successfully: {computed_hash}")
|
|
|
| return computed_hash
|
|
|
|
|
| if __name__ == "__main__":
|
|
|
| import sys
|
|
|
| file_path = "c:/temp/hunyuan_15_upsampler.safetensors"
|
| expected_hash = "691dc1b81b49d942e2eb95e6d61b91321e17b868536eaa4e843db6e406390411"
|
|
|
| try:
|
| hash_value = compute_sha256(file_path, expected_hash)
|
| print(f"SHA256: {hash_value}")
|
| except (FileNotFoundError, ValueError) as e:
|
| print(f"Error: {e}")
|
| sys.exit(1)
|
|
|