summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_hashlib_speed.py
diff options
context:
space:
mode:
authorGregory P. Smith <greg@mad-scientist.com>2005-08-21 18:45:59 (GMT)
committerGregory P. Smith <greg@mad-scientist.com>2005-08-21 18:45:59 (GMT)
commitf21a5f773964d34c7b6deb7e3d753fae2b9c70e2 (patch)
treeba3b66cea11da1d8e930555aa5a10f775a285d84 /Lib/test/test_hashlib_speed.py
parent33a5f2af59ddcf3f1b0447a8dbd0576fd78de303 (diff)
downloadcpython-f21a5f773964d34c7b6deb7e3d753fae2b9c70e2.zip
cpython-f21a5f773964d34c7b6deb7e3d753fae2b9c70e2.tar.gz
cpython-f21a5f773964d34c7b6deb7e3d753fae2b9c70e2.tar.bz2
[ sf.net patch # 1121611 ]
A new hashlib module to replace the md5 and sha modules. It adds support for additional secure hashes such as SHA-256 and SHA-512. The hashlib module uses OpenSSL for fast platform optimized implementations of algorithms when available. The old md5 and sha modules still exist as wrappers around hashlib to preserve backwards compatibility.
Diffstat (limited to 'Lib/test/test_hashlib_speed.py')
-rw-r--r--Lib/test/test_hashlib_speed.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/Lib/test/test_hashlib_speed.py b/Lib/test/test_hashlib_speed.py
new file mode 100644
index 0000000..a62d923
--- /dev/null
+++ b/Lib/test/test_hashlib_speed.py
@@ -0,0 +1,93 @@
+
+import sys, time
+import hashlib
+from test import test_support
+
+
+def creatorFunc():
+ raise RuntimeError, "eek, creatorFunc not overridden"
+
+
+def test_scaled_msg(scale, name):
+
+ iterations = 106201/scale * 20
+ longStr = 'Z'*scale
+
+ localCF = creatorFunc
+ start = time.time()
+ for f in xrange(iterations):
+ x = localCF(longStr).digest()
+ end = time.time()
+
+ print ('%2.2f' % (end-start)), "seconds", iterations, "x", len(longStr), "bytes", name
+
+def test_create():
+ start = time.time()
+ for f in xrange(20000):
+ d = creatorFunc()
+ end = time.time()
+
+ print ('%2.2f' % (end-start)), "seconds", '[20000 creations]'
+
+def test_zero():
+ start = time.time()
+ for f in xrange(20000):
+ x = creatorFunc().digest()
+ end = time.time()
+
+ print ('%2.2f' % (end-start)), "seconds", '[20000 "" digests]'
+
+
+
+### this 'test' is not normally run. skip it if the test runner finds it
+if __name__ != '__main__':
+ raise test_support.TestSkipped, "not a unit test (stand alone benchmark)"
+
+hName = sys.argv[1]
+
+#
+# setup our creatorFunc to test the requested hash
+#
+if hName in ('_md5', '_sha'):
+ exec 'import '+hName
+ exec 'creatorFunc = '+hName+'.new'
+ print "testing speed of old", hName, "legacy interface"
+elif hName == '_hashlib' and len(sys.argv) > 3:
+ import _hashlib
+ exec 'creatorFunc = _hashlib.%s' % sys.argv[2]
+ print "testing speed of _hashlib.%s" % sys.argv[2], getattr(_hashlib, sys.argv[2])
+elif hName == '_hashlib' and len(sys.argv) == 3:
+ import _hashlib
+ exec 'creatorFunc = lambda x=_hashlib.new : x(%r)' % sys.argv[2]
+ print "testing speed of _hashlib.new(%r)" % sys.argv[2]
+elif hasattr(hashlib, hName) and callable(getattr(hashlib, hName)):
+ creatorFunc = getattr(hashlib, hName)
+ print "testing speed of hashlib."+hName, getattr(hashlib, hName)
+else:
+ exec "creatorFunc = lambda x=hashlib.new : x(%r)" % hName
+ print "testing speed of hashlib.new(%r)" % hName
+
+try:
+ test_create()
+except ValueError:
+ print
+ print "pass argument(s) naming the hash to run a speed test on:"
+ print " '_md5' and '_sha' test the legacy builtin md5 and sha"
+ print " '_hashlib' 'openssl_hName' 'fast' tests the builtin _hashlib"
+ print " '_hashlib' 'hName' tests builtin _hashlib.new(shaFOO)"
+ print " 'hName' tests the hashlib.hName() implementation if it exists"
+ print " otherwise it uses hashlib.new(hName)."
+ print
+ raise
+
+test_zero()
+test_scaled_msg(scale=106201, name='[huge data]')
+test_scaled_msg(scale=10620, name='[large data]')
+test_scaled_msg(scale=1062, name='[medium data]')
+test_scaled_msg(scale=424, name='[4*small data]')
+test_scaled_msg(scale=336, name='[3*small data]')
+test_scaled_msg(scale=212, name='[2*small data]')
+test_scaled_msg(scale=106, name='[small data]')
+test_scaled_msg(scale=creatorFunc().digest_size, name='[digest_size data]')
+test_scaled_msg(scale=10, name='[tiny data]')
+