def _do_digest(data, func): """Return the binary digest of `data` with the given `func`.""" func = FuncReg.get(func) hash = FuncReg.hash_from_func(func) if not hash: raise ValueError("no available hash function for hash", func) hash.update(data) return bytes(hash.digest())
def __new__(cls, func, digest): try: func = FuncReg.get(func) except KeyError: if _is_app_specific_func(func): # Application-specific function codes # are allowed even if not registered. func = int(func) else: raise digest = bytes(digest) return super(cls, Multihash).__new__(cls, func, digest)
def from_hash(self, hash): """Create a `Multihash` from a hashlib-compatible `hash` object. >>> import hashlib >>> data = b'foo' >>> hash = hashlib.sha1(data) >>> digest = hash.digest() >>> mh = Multihash.from_hash(hash) >>> mh == (Func.sha1, digest) True Application-specific hash functions are also supported (see `FuncReg`). If there is no matching multihash hash function for the given `hash`, a `ValueError` is raised. """ try: func = FuncReg.func_from_hash(hash) except KeyError as ke: raise ValueError( "no matching multihash function", hash.name) from ke digest = hash.digest() return Multihash(func, digest)