aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Lib/hashlib.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/hashlib.py')
-rw-r--r--Lib/hashlib.py70
1 files changed, 36 insertions, 34 deletions
diff --git a/Lib/hashlib.py b/Lib/hashlib.py
index d20e1f95a2a..21454c7d306 100644
--- a/Lib/hashlib.py
+++ b/Lib/hashlib.py
@@ -1,22 +1,21 @@
-# $Id$
-#
-# Copyright (C) 2005 Gregory P. Smith (greg@krypto.org)
+# Copyright (C) 2005-2010 Gregory P. Smith (greg@krypto.org)
# Licensed to PSF under a Contributor Agreement.
#
__doc__ = """hashlib module - A common interface to many hash functions.
-new(name, string='') - returns a new hash object implementing the
- given hash function; initializing the hash
- using the given string data.
+new(name, data=b'') - returns a new hash object implementing the
+ given hash function; initializing the hash
+ using the given binary data.
-Named constructor functions are also available, these are much faster
-than using new():
+Named constructor functions are also available, these are faster
+than using new(name):
md5(), sha1(), sha224(), sha256(), sha384(), and sha512()
-More algorithms may be available on your platform but the above are
-guaranteed to exist.
+More algorithms may be available on your platform but the above are guaranteed
+to exist. See the algorithms_guaranteed and algorithms_available attributes
+to find out what algorithm names can be passed to new().
NOTE: If you want the adler32 or crc32 hash functions they are available in
the zlib module.
@@ -25,14 +24,13 @@ Choose your hash function wisely. Some have known collision weaknesses.
sha384 and sha512 will be slow on 32 bit platforms.
Hash objects have these methods:
- - update(arg): Update the hash object with the string arg. Repeated calls
+ - update(arg): Update the hash object with the bytes in arg. Repeated calls
are equivalent to a single call with the concatenation of all
the arguments.
- - digest(): Return the digest of the strings passed to the update() method
- so far. This may contain non-ASCII characters, including
- NUL bytes.
- - hexdigest(): Like digest() except the digest is returned as a string of
- double length, containing only hexadecimal digits.
+ - digest(): Return the digest of the bytes passed to the update() method
+ so far.
+ - hexdigest(): Like digest() except the digest is returned as a unicode
+ object of double length, containing only hexadecimal digits.
- copy(): Return a copy (clone) of the hash object. This can be used to
efficiently compute the digests of strings that share a common
initial substring.
@@ -42,14 +40,14 @@ spammish repetition':
>>> import hashlib
>>> m = hashlib.md5()
- >>> m.update("Nobody inspects")
- >>> m.update(" the spammish repetition")
+ >>> m.update(b"Nobody inspects")
+ >>> m.update(b" the spammish repetition")
>>> m.digest()
- '\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9'
+ b'\\xbbd\\x9c\\x83\\xdd\\x1e\\xa5\\xc9\\xd9\\xde\\xc9\\xa1\\x8d\\xf0\\xff\\xe9'
More condensed:
- >>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
+ >>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
"""
@@ -58,19 +56,21 @@ More condensed:
# always available algorithm is added.
__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
-algorithms = __always_supported
+algorithms_guaranteed = set(__always_supported)
+algorithms_available = set(__always_supported)
-__all__ = __always_supported + ('new', 'algorithms')
+__all__ = __always_supported + ('new', 'algorithms_guaranteed',
+ 'algorithms_available')
def __get_builtin_constructor(name):
try:
if name in ('SHA1', 'sha1'):
- import _sha
- return _sha.new
+ import _sha1
+ return _sha1.sha1
elif name in ('MD5', 'md5'):
import _md5
- return _md5.new
+ return _md5.md5
elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
import _sha256
bs = name[3:]
@@ -103,31 +103,33 @@ def __get_openssl_constructor(name):
return __get_builtin_constructor(name)
-def __py_new(name, string=''):
- """new(name, string='') - Return a new hashing object using the named algorithm;
- optionally initialized with a string.
+def __py_new(name, data=b''):
+ """new(name, data=b'') - Return a new hashing object using the named algorithm;
+ optionally initialized with data (which must be bytes).
"""
- return __get_builtin_constructor(name)(string)
+ return __get_builtin_constructor(name)(data)
-def __hash_new(name, string=''):
- """new(name, string='') - Return a new hashing object using the named algorithm;
- optionally initialized with a string.
+def __hash_new(name, data=b''):
+ """new(name, data=b'') - Return a new hashing object using the named algorithm;
+ optionally initialized with data (which must be bytes).
"""
try:
- return _hashlib.new(name, string)
+ return _hashlib.new(name, data)
except ValueError:
# If the _hashlib module (OpenSSL) doesn't support the named
# hash, try using our builtin implementations.
# This allows for SHA224/256 and SHA384/512 support even though
# the OpenSSL library prior to 0.9.8 doesn't provide them.
- return __get_builtin_constructor(name)(string)
+ return __get_builtin_constructor(name)(data)
try:
import _hashlib
new = __hash_new
__get_hash = __get_openssl_constructor
+ algorithms_available = algorithms_available.union(
+ _hashlib.openssl_md_meth_names)
except ImportError:
new = __py_new
__get_hash = __get_builtin_constructor