Source code for transparentmeta.crypto.hasher

# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (c) 2025 Transparent Audio
# Author: Valerio Velardo - valerio@transparentaudio.ai

"""
This module provides a simple wrapper around Python's hashlib library to
compute cryptographic hash digests using various algorithms such as SHA-256,
SHA-512, and MD5.
"""

import hashlib
import logging

logger = logging.getLogger(__name__)


[docs] class Hasher: """A utility class for computing hash digests using various cryptographic algorithms. Attributes: hash_algorithm_name (str): The name of the hashing algorithm (e.g., "sha256"). """
[docs] def __init__(self, hash_algorithm_name: str = "sha256") -> None: """Initializes the Hasher with the specified hashing algorithm. Args: hash_algorithm_name (str, optional): The name of the hash algorithm to use. Defaults to "sha256". Raises: ValueError: If the specified algorithm is not supported by hashlib. """ self.hash_algorithm_name = hash_algorithm_name self._raise_value_error_if_hash_algorithm_is_not_available()
[docs] def hash(self, data: bytes) -> str: """Computes the hash digest of the given data using the specified algorithm. Args: data (bytes): The input data to be hashed. Returns: hexadecimal_hash_digest (str): The hexadecimal digest of the hashed data. """ hash_algorithm = hashlib.new(self.hash_algorithm_name) hash_algorithm.update(data) hexadecimal_hash_digest = hash_algorithm.hexdigest() logger.debug( "Computed %s hexadecimal hash: %s", self.hash_algorithm_name, hexadecimal_hash_digest, ) return hexadecimal_hash_digest
def _raise_value_error_if_hash_algorithm_is_not_available(self) -> None: if self.hash_algorithm_name not in hashlib.algorithms_available: raise ValueError( f"Invalid hash algorithm: {self.hash_algorithm_name}" )