def make_digesters(fpath, families, include_CRCs=False):
"""
Create and return a dictionary of all our active hash algorithms.
Each digester is a 2-tuple ``( digester.update_func(bytes), digest_func(digester) -> int)``.
"""
## TODO: simplify digester-tuple API, ie: (digester, update_func(d), digest_func(d))
families = set(f.upper() for f in families)
digesters = OrderedDict()
digesters['LENGTH'] = (LenDigester(), LenDigester.digest)
# Default Algos
for algo in sorted(hashlib.algorithms_available):
# algorithms_available can have duplicates
aname = algo.upper()
if aname not in digesters and is_algo_in_families(aname, families):
digesters[aname] = (hashlib.new(algo), lambda d: d.hexdigest())
# CRC
if include_CRCs:
for name in sorted(crcmod._crc_definitions_by_name):
crc_name = crcmod._crc_definitions_by_name[name]['name']
aname = crc_name.upper()
if is_algo_in_families(aname, families):
digesters[aname] = (crcmod.PredefinedCrc(crc_name),
lambda d: hex(d.crcValue))
add_git_digesters(digesters, fpath)
## Append plugin digesters.
#
digesters.update(known_digesters)
for digester in list(digesters.keys()):
if not is_algo_in_families(digester.upper(), families):
digesters.pop(digester, None)
return digesters
评论列表
文章目录