September 06, 2017

Digging into python's bytecode

   ---_ ......._-_--.
  (|\ /      / /| \  \
  /  /     .'  -=-'   `.
 /  /    .'             )    _/  /   .'        _.)   /   / o   o        _.-' /  .'   \          _.-'    / .'*|    \______.-'//    .'.' \*|
\|  \ | //   .'.' _ |*|
 `   \|//  .'.'_ _ _|*|
  .  .// .'.' | _ _ \*|
  \`-|\_/ /    \ _ _ \*\
   `/'\__/      \ _ _ \*\
  /^|            \ _ _ \*
 '  `             \ _ _ \      
                   \_ a version of the hashlib.foo methods that hash entire files rather than strings:

Code:

# filehash.py
import hashlib


class Hasher(object):
    """
    A wrapper around the hashlib hash algorithms that allows an entire file to
    be hashed in a chunked manner.
    """
    def __init__(self, algorithm):
        self.algorithm = algorithm

    def __call__(self, file):
        hash = self.algorithm()
        with open(file, 'rb') as f:
            for chunk in iter(lambda: f.read(4096), ''):
                hash.update(chunk)
        return hash.hexdigest()


md5    = Hasher(hashlib.md5)
sha1   = Hasher(hashlib.sha1)
sha224 = Hasher(hashlib.sha224)
sha256 = Hasher(hashlib.sha256)
sha384 = Hasher(hashlib.sha384)
sha512 = Hasher(hashlib.sha512)

Then use it like this.Whoop! a nicer and consistent api.

from filehash import sha1
print sha1('somefile.txt')