From: <pj...@us...> - 2008-06-27 03:25:12
|
Revision: 4796 http://jython.svn.sourceforge.net/jython/?rev=4796&view=rev Author: pjenvey Date: 2008-06-26 20:25:09 -0700 (Thu, 26 Jun 2008) Log Message: ----------- optimize _hashlib.HASH to take advantage of MessageDigest.clone which is supported for all of our hashing types Modified Paths: -------------- branches/asm/src/org/python/modules/_hashlib.java Modified: branches/asm/src/org/python/modules/_hashlib.java =================================================================== --- branches/asm/src/org/python/modules/_hashlib.java 2008-06-27 03:14:37 UTC (rev 4795) +++ branches/asm/src/org/python/modules/_hashlib.java 2008-06-27 03:25:09 UTC (rev 4796) @@ -3,10 +3,8 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import java.util.List; import org.python.core.ClassDictInit; import org.python.core.PyObject; @@ -111,12 +109,6 @@ @ExposedGet public String name; - /** - * The inputted data, maintained because Java MessageDigest resets after - * calculating a digest. - */ - private List<byte[]> data; - /** The hashing engine. */ private MessageDigest digest; @@ -129,7 +121,7 @@ put("sha-512", 128); }}; - public Hash(String name, List data) { + public Hash(String name) { super(TYPE); this.name = name; try { @@ -137,22 +129,36 @@ } catch (NoSuchAlgorithmException nsae) { throw Py.ValueError("unsupported hash type"); } - this.data = data == null ? new ArrayList() : data; } - public Hash(String name) { - this(name, null); + private Hash(String name, MessageDigest digest) { + super(TYPE); + this.name = name; + this.digest = digest; } /** - * Input all of the data required to calculate the digest. + * Clone the underlying MessageDigest. + * + * @return a copy of MessageDigest */ - private void calculate() { - for (byte[] bytes : data) { - digest.update(bytes); + private MessageDigest cloneDigest() { + try { + return (MessageDigest)digest.clone(); + } catch (CloneNotSupportedException cnse) { + throw Py.RuntimeError(String.format("_hashlib.HASH (%s) internal error", name)); } } + /** + * Safely calculate the digest without resetting state. + * + * @return a byte[] calculated digest + */ + private byte[] calculateDigest() { + return cloneDigest().digest(); + } + public void update(PyObject obj) { HASH_update(obj); } @@ -164,7 +170,7 @@ + obj.getType().fastGetName()); } byte[] bytes = ((PyString)obj).toBytes(); - data.add(bytes); + digest.update(bytes); } public PyObject digest() { @@ -173,8 +179,7 @@ @ExposedMethod final PyObject HASH_digest() { - calculate(); - return Py.newString(StringUtil.fromBytes(digest.digest())); + return Py.newString(StringUtil.fromBytes(calculateDigest())); } public PyObject hexdigest() { @@ -183,8 +188,7 @@ @ExposedMethod final PyObject HASH_hexdigest() { - calculate(); - byte[] result = digest.digest(); + byte[] result = calculateDigest(); // Make hex version of the digest char[] hexDigest = new char[result.length * 2]; for (int i = 0, j = 0; i < result.length; i++) { @@ -204,7 +208,7 @@ @ExposedMethod final PyObject HASH_copy() { - return new Hash(name, new ArrayList(data)); + return new Hash(name, cloneDigest()); } @ExposedGet(name = "digestsize") This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |