You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2012/10/05 19:08:32 UTC

svn commit: r1394650 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: api/Blob.java plugins/memory/AbstractBlob.java

Author: mduerig
Date: Fri Oct  5 17:08:31 2012
New Revision: 1394650

URL: http://svn.apache.org/viewvc?rev=1394650&view=rev
Log:
OAK-350: Unify PropertyState and CoreValue
- correct hashing for Blob

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java?rev=1394650&r1=1394649&r2=1394650&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/api/Blob.java Fri Oct  5 17:08:31 2012
@@ -23,4 +23,10 @@ public interface Blob {
      * @return the length of this blob.
      */
     long length();
+
+    /**
+     * The SHA-256 digest of the underlying stream
+     * @return
+     */
+    byte[] sha256();
 }

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java?rev=1394650&r1=1394649&r2=1394650&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/memory/AbstractBlob.java Fri Oct  5 17:08:31 2012
@@ -2,8 +2,12 @@ package org.apache.jackrabbit.oak.plugin
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Arrays;
 
 import com.google.common.base.Optional;
+import com.google.common.hash.HashCode;
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
 import org.apache.jackrabbit.oak.api.Blob;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -16,7 +20,7 @@ import org.slf4j.LoggerFactory;
 public abstract class AbstractBlob implements Blob {
     private static final Logger log = LoggerFactory.getLogger(AbstractBlob.class);
 
-    private Optional<Integer> hashCode = Optional.absent();
+    private Optional<HashCode> hashCode = Optional.absent();
 
     /**
      * This hash code implementation returns the hash code of the underlying stream
@@ -24,28 +28,56 @@ public abstract class AbstractBlob imple
      */
     @Override
     public int hashCode() {
+        return calculateSha256().asInt();
+    }
+
+    @Override
+    public byte[] sha256() {
+        return calculateSha256().asBytes();
+    }
+
+    private HashCode calculateSha256() {
         // Blobs are immutable so we can safely cache the hash
         if (!hashCode.isPresent()) {
-            InputStream s = getNewStream();
+            InputStream is = getNewStream();
             try {
-                hashCode = Optional.of(s.hashCode());
+                try {
+                    Hasher hasher = Hashing.sha256().newHasher();
+                    byte[] buf = new byte[0x1000];
+                    int r;
+                    while((r = is.read(buf)) != -1) {
+                        hasher.putBytes(buf, 0, r);
+                    }
+                    hashCode = Optional.of(hasher.hash());
+                }
+                catch (IOException e) {
+                    log.warn("Error while hashing stream", e);
+                }
             }
             finally {
-                close(s);
+                close(is);
             }
         }
         return hashCode.get();
     }
 
     /**
-     * To {@code Blob} instances are considered equal iff they have the same hash code
+     * To {@code Blob} instances are considered equal iff they have the same SHA-256 hash code
      * are equal.
      * @param other
      * @return
      */
     @Override
     public boolean equals(Object other) {
-        return other == this || other instanceof Blob && hashCode() == other.hashCode();
+        if (other == this) {
+            return true;
+        }
+        if (!(other instanceof Blob)) {
+            return false;
+        }
+
+        Blob that = (Blob) other;
+        return Arrays.equals(sha256(), that.sha256());
     }
 
     private static void close(InputStream s) {