]> granicus.if.org Git - python/commitdiff
Speed HMAC.copy() by installing a secret backdoor argument to
authorTim Peters <tim.peters@gmail.com>
Sat, 20 Mar 2004 20:11:29 +0000 (20:11 +0000)
committerTim Peters <tim.peters@gmail.com>
Sat, 20 Mar 2004 20:11:29 +0000 (20:11 +0000)
HMAC.__init__().  Adapted from SF patch 895445 "hmac.HMAC.copy() speedup"
by Trevor Perrin, who reported that this approach increased throughput
of his hmac-intensive app by 30%.

Lib/hmac.py

index db9b404c9a97a0bb2057a00fce65e9d8f65d65b4..11b0fb33f4fd864cf9de17629195e8f56d6a696a 100644 (file)
@@ -12,6 +12,11 @@ def _strxor(s1, s2):
 # hashing module used.
 digest_size = None
 
+# A unique object passed by HMAC.copy() to the HMAC constructor, in order
+# that the latter return very quickly.  HMAC("") in contrast is quite
+# expensive.
+_secret_backdoor_key = []
+
 class HMAC:
     """RFC2104 HMAC class.
 
@@ -25,6 +30,10 @@ class HMAC:
         msg:       Initial input for the hash, if provided.
         digestmod: A module supporting PEP 247. Defaults to the md5 module.
         """
+
+        if key is _secret_backdoor_key: # cheap
+            return
+
         if digestmod is None:
             import md5
             digestmod = md5
@@ -60,8 +69,9 @@ class HMAC:
 
         An update to this copy won't affect the original object.
         """
-        other = HMAC("")
+        other = HMAC(_secret_backdoor_key)
         other.digestmod = self.digestmod
+        other.digest_size = self.digest_size
         other.inner = self.inner.copy()
         other.outer = self.outer.copy()
         return other