aif-ng/aif/utils/hash_handler.py

49 lines
1.6 KiB
Python

import hashlib
import pathlib
import zlib
##
import aif.constants_fallback
from . import file_handler
class Hash(object):
def __init__(self, file_path):
self.hashers = None
def configure(self, hashalgo = None):
self.hashers = {}
if hashalgo:
if not isinstance(hashalgo, list):
hashalgo = [hashalgo]
else:
hashalgo = list(aif.constants_fallback.HASH_SUPPORTED_TYPES)
for h in hashalgo:
if h not in aif.constants_fallback.HASH_SUPPORTED_TYPES:
raise ValueError('Hash algorithm not supported')
if h not in aif.constants_fallback.HASH_EXTRA_SUPPORTED_TYPES:
hasher = hashlib.new(h)
else: # adler32 and crc32
hasher = getattr(zlib, h)
self.hashers[h] = hasher
return()
def hashData(self, data):
results = {}
if not self.hashers:
self.configure()
for hashtype, hasher in self.hashers.items():
if hashtype in aif.constants_fallback.HASH_EXTRA_SUPPORTED_TYPES:
results[hashtype] = hasher(data)
else:
rslt = hasher.update(data)
results[hashtype] = rslt.hexdigest()
return(results)
def hashFile(self, file_path):
if not isinstance(file_path, (str, file_handler.File, pathlib.Path, pathlib.PurePath)):
raise ValueError('file_path must be a path expression')
file_path = str(file_path)
with open(file_path, 'rb') as fh:
results = self.hashData(fh.read())
return(results)