# HG changeset patch # User Andre Heinecke # Date 1427989218 -7200 # Node ID af415396d9cad17b7fbbfc1541df51eef90bf96d # Parent 3531f0cee5e10dd435064a7b2ae59aad00f205a4 (issue1803) Use MD5 instead of a homegrown hashing algorithm For creating a digest of the parametrization we should use an algorithm that does not create collisions if there are small changes in the parametrization so that wrong results are returned. diff -r 3531f0cee5e1 -r af415396d9ca artifacts/src/main/java/org/dive4elements/river/artifacts/D4EArtifact.java --- a/artifacts/src/main/java/org/dive4elements/river/artifacts/D4EArtifact.java Thu Apr 02 17:17:51 2015 +0200 +++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/D4EArtifact.java Thu Apr 02 17:40:18 2015 +0200 @@ -18,7 +18,14 @@ import java.util.Set; import java.util.TreeMap; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.io.ByteArrayOutputStream; +import java.io.ObjectOutputStream; +import java.io.IOException; + import javax.xml.xpath.XPathConstants; +import javax.xml.bind.DatatypeConverter; import net.sf.ehcache.Cache; @@ -1135,20 +1142,21 @@ */ @Override public String hash() { - - long hash = 0L; - int shift = 3; - - for (Map.Entry entry: data.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue().getValue(); - - hash ^= ((long)key.hashCode() << shift) - | ((long)value.hashCode() << (shift + 3)); - shift += 2; + try { + ByteArrayOutputStream ba = new ByteArrayOutputStream(); + ObjectOutputStream oa = new ObjectOutputStream(ba); + for (Map.Entry entry: data.entrySet()) { + oa.writeObject(entry.getKey()); + oa.writeObject(entry.getValue().getValue()); + } + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] md5sum = md.digest(ba.toByteArray()); + return DatatypeConverter.printBase64Binary(md5sum); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("MD5 unavailable. Can't happen."); + } catch (IOException e) { + throw new RuntimeException("Cant write parameter. Can't happen."); } - - return getCurrentStateId() + hash; } @@ -1509,7 +1517,7 @@ if (cache != null) { net.sf.ehcache.Element element = cache.get(key); if (element != null) { - log.debug("Got computation result from cache."); + log.debug("Got computation result from cache for key: " + key); old = element.getValue(); } }