Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.util.hash_util
"""
Utility functions for bi-directional Python version compatibility. Python 2.5
introduced hashlib which replaced sha in Python 2.4 and previous versions.
"""
from __future__ import absolute_import
import hashlib
import hmac
import logging
from . import smart_str
log = logging.getLogger(__name__)
BLOCK_SIZE = 1024 * 1024
sha1 = hashlib.sha1
sha256 = hashlib.sha256
sha512 = hashlib.sha512
sha = sha1
md5 = hashlib.md5
HASH_NAME_MAP = {
"MD5": md5,
"SHA-1": sha1,
"SHA-256": sha256,
"SHA-512": sha512,
}
HASH_NAMES = list(HASH_NAME_MAP.keys())
def memory_bound_hexdigest(hash_func=None, hash_func_name=None, path=None, file=None):
if hash_func is None:
assert hash_func_name is not None
hash_func = HASH_NAME_MAP[hash_func_name]
hasher = hash_func()
if file is None:
assert path is not None
file = open(path, "rb")
else:
assert path is None, "Cannot specify path and path keyword arguments."
try:
for block in iter(lambda: file.read(BLOCK_SIZE), b''):
hasher.update(block)
return hasher.hexdigest()
finally:
file.close()
def md5_hash_file(path):
"""
Return a md5 hashdigest for a file or None if path could not be read.
"""
hasher = hashlib.md5()
try:
with open(path, 'rb') as afile:
buf = afile.read()
hasher.update(buf)
return hasher.hexdigest()
except IOError:
# This may happen if path has been deleted
return None
[docs]def new_secure_hash(text_type):
"""
Returns the hexdigest of the sha1 hash of the argument `text_type`.
"""
assert text_type is not None
return sha1(smart_str(text_type)).hexdigest()
__all__ = ('md5', 'hashlib', 'sha1', 'sha', 'new_secure_hash', 'hmac_new', 'is_hashable')