maestral.utils.hashing ====================== .. py:module:: maestral.utils.hashing .. autoapi-nested-parse:: Module for content hashing file contents. Module Contents --------------- .. py:class:: DropboxContentHasher Computes a hash using the same algorithm that the Dropbox API uses for the "content_hash" metadata field. The :meth:`digest` method returns a raw binary representation of the hash. The :meth:`hexdigest` convenience method returns a hexadecimal-encoded version, which is what the "content_hash" metadata field uses. This class has the same interface as the hashers in the standard 'hashlib' package. :Example: Read a file in chunks of 1024 bytes and compute its content hash: >>> hasher = DropboxContentHasher() >>> with open('some-file', 'rb') as f: ... while True: ... chunk = f.read(1024) ... if len(chunk) == 0: ... break ... hasher.update(chunk) ... print(hasher.hexdigest()) .. py:attribute:: BLOCK_SIZE .. py:method:: update(new_data) .. py:method:: digest() .. py:method:: hexdigest() .. py:method:: copy() .. py:class:: StreamHasher(f, hasher) A wrapper around a file-like object (either for reading or writing) that hashes everything that passes through it. Can be used with DropboxContentHasher or any 'hashlib' hasher. :Example: >>> hasher = DropboxContentHasher() >>> with open('some-file', 'rb') as f: ... wrapped_f = StreamHasher(f, hasher) ... response = some_api_client.upload(wrapped_f) >>> locally_computed = hasher.hexdigest() >>> assert response.content_hash == locally_computed :param f: File-like object. :param hasher: Hasher to use. Must implement an ``update`` method. .. py:method:: close() .. py:method:: flush() .. py:method:: fileno() .. py:method:: tell() .. py:method:: read(size = -1) .. py:method:: write(b) .. py:method:: readline(size = -1) .. py:method:: readlines(hint = -1)