comparison env/lib/python3.7/site-packages/galaxy/util/hash_util.py @ 2:6af9afd405e9 draft

"planemo upload commit 0a63dd5f4d38a1f6944587f52a8cd79874177fc1"
author shellac
date Thu, 14 May 2020 14:56:58 -0400
parents 26e78fe6e8c4
children
comparison
equal deleted inserted replaced
1:75ca89e9b81c 2:6af9afd405e9
1 """
2 Utility functions for bi-directional Python version compatibility. Python 2.5
3 introduced hashlib which replaced sha in Python 2.4 and previous versions.
4 """
5 from __future__ import absolute_import
6
7 import hashlib
8 import hmac
9 import logging
10
11 from . import smart_str
12
13
14 log = logging.getLogger(__name__)
15
16 BLOCK_SIZE = 1024 * 1024
17
18 sha1 = hashlib.sha1
19 sha256 = hashlib.sha256
20 sha512 = hashlib.sha512
21 sha = sha1
22 md5 = hashlib.md5
23
24 HASH_NAME_MAP = {
25 "MD5": md5,
26 "SHA-1": sha1,
27 "SHA-256": sha256,
28 "SHA-512": sha512,
29 }
30 HASH_NAMES = list(HASH_NAME_MAP.keys())
31
32
33 def memory_bound_hexdigest(hash_func=None, hash_func_name=None, path=None, file=None):
34 if hash_func is None:
35 assert hash_func_name is not None
36 hash_func = HASH_NAME_MAP[hash_func_name]
37
38 hasher = hash_func()
39 if file is None:
40 assert path is not None
41 file = open(path, "rb")
42 else:
43 assert path is None, "Cannot specify path and path keyword arguments."
44
45 try:
46 for block in iter(lambda: file.read(BLOCK_SIZE), b''):
47 hasher.update(block)
48 return hasher.hexdigest()
49 finally:
50 file.close()
51
52
53 def md5_hash_file(path):
54 """
55 Return a md5 hashdigest for a file or None if path could not be read.
56 """
57 hasher = hashlib.md5()
58 try:
59 with open(path, 'rb') as afile:
60 buf = afile.read()
61 hasher.update(buf)
62 return hasher.hexdigest()
63 except IOError:
64 # This may happen if path has been deleted
65 return None
66
67
68 def new_secure_hash(text_type):
69 """
70 Returns the hexdigest of the sha1 hash of the argument `text_type`.
71 """
72 assert text_type is not None
73 return sha1(smart_str(text_type)).hexdigest()
74
75
76 def hmac_new(key, value):
77 return hmac.new(key, value, sha).hexdigest()
78
79
80 def is_hashable(value):
81 try:
82 hash(value)
83 except Exception:
84 return False
85 return True
86
87
88 __all__ = ('md5', 'hashlib', 'sha1', 'sha', 'new_secure_hash', 'hmac_new', 'is_hashable')