From 934d31b1d340f1d309d6ec6a861fa94077033b0f Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sat, 20 Mar 2004 20:11:29 +0000 Subject: [PATCH] Speed HMAC.copy() by installing a secret backdoor argument to 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 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Lib/hmac.py b/Lib/hmac.py index db9b404c9a9..11b0fb33f4f 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -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