54 lines
1.6 KiB
Python
54 lines
1.6 KiB
Python
import json
|
|
import os
|
|
|
|
from modules.util import sha256, HASH_SHA256_LENGTH
|
|
|
|
hash_cache_filename = 'hash_cache.txt'
|
|
hash_cache = {}
|
|
|
|
|
|
def sha256_from_cache(filepath):
|
|
global hash_cache
|
|
if filepath not in hash_cache:
|
|
hash_value = sha256(filepath)
|
|
hash_cache[filepath] = hash_value
|
|
save_cache_to_file(filepath, hash_value)
|
|
|
|
return hash_cache[filepath]
|
|
|
|
|
|
def load_cache_from_file():
|
|
global hash_cache
|
|
|
|
try:
|
|
if os.path.exists(hash_cache_filename):
|
|
with open(hash_cache_filename, 'rt', encoding='utf-8') as fp:
|
|
for line in fp:
|
|
entry = json.loads(line)
|
|
for filepath, hash_value in entry.items():
|
|
if not os.path.exists(filepath) or not isinstance(hash_value, str) and len(hash_value) != HASH_SHA256_LENGTH:
|
|
print(f'[Cache] Skipping invalid cache entry: {filepath}')
|
|
continue
|
|
hash_cache[filepath] = hash_value
|
|
except Exception as e:
|
|
print(f'[Cache] Loading failed: {e}')
|
|
|
|
|
|
def save_cache_to_file(filename=None, hash_value=None):
|
|
global hash_cache
|
|
|
|
if filename is not None and hash_value is not None:
|
|
items = [(filename, hash_value)]
|
|
mode = 'at'
|
|
else:
|
|
items = sorted(hash_cache.items())
|
|
mode = 'wt'
|
|
|
|
try:
|
|
with open(hash_cache_filename, mode, encoding='utf-8') as fp:
|
|
for filepath, hash_value in items:
|
|
json.dump({filepath: hash_value}, fp)
|
|
fp.write('\n')
|
|
except Exception as e:
|
|
print(f'[Cache] Saving failed: {e}')
|