|
|
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) |
|
|
|