Slim Skia down to just one murmur3 implementation.
authormtklein <mtklein@chromium.org>
Wed, 9 Jul 2014 15:49:08 +0000 (08:49 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 9 Jul 2014 15:49:08 +0000 (08:49 -0700)
BUG=skia:
R=reed@google.com, mtklein@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/376183004

bench/FontCacheBench.cpp
src/core/SkChecksum.h
src/core/SkImageFilter.cpp
src/core/SkScaledImageCache.cpp

index 0e75c9cb174f5f8d95e416671dcf4c660991dd56..697bde64f42739456eaff520cea0d38c42ad67d5 100644 (file)
@@ -7,6 +7,7 @@
 
 #include "Benchmark.h"
 #include "SkCanvas.h"
+#include "SkChecksum.h"
 #include "SkFontHost.h"
 #include "SkPaint.h"
 #include "SkString.h"
@@ -64,23 +65,12 @@ static uint32_t hasher0(uint32_t value) {
     return value ^ (value >> 8);
 }
 
-static uint32_t hasher2(uint32_t h) {
-    h ^= h >> 16;
-    h *= 0x85ebca6b;
-    h ^= h >> 13;
-    h *= 0xc2b2ae35;
-    h ^= h >> 16;
-
-    h ^= (h >> 8);
-    return h;
-}
-
 static const struct {
     const char* fName;
     HasherProc  fHasher;
 } gRec[] = {
     { "hasher0",  hasher0 },
-    { "hasher2",  hasher2 },
+    { "hasher2",  SkChecksum::Mix },
 };
 
 #define kMaxHashBits   12
index bf3228f91db8722337e9b06db0fb23fb491d4e37..fe1e9584a20e8e87c2475a648af21e03db9e6710 100644 (file)
@@ -36,6 +36,20 @@ private:
     }
 
 public:
+    /**
+     * uint32_t -> uint32_t hash, useful for when you're about to trucate this hash but you
+     * suspect its low bits aren't well mixed.
+     *
+     * This is the Murmur3 finalizer.
+     */
+    static uint32_t Mix(uint32_t hash) {
+        hash ^= hash >> 16;
+        hash *= 0x85ebca6b;
+        hash ^= hash >> 13;
+        hash *= 0xc2b2ae35;
+        hash ^= hash >> 16;
+        return hash;
+    }
 
     /**
      * Calculate 32-bit Murmur hash (murmur3).
@@ -48,7 +62,7 @@ public:
      *  @return hash result
      */
     static uint32_t Murmur3(const uint32_t* data, size_t bytes, uint32_t seed=0) {
-        SkASSERT(SkIsAlign4(bytes));
+        SkASSERTF(SkIsAlign4(bytes), "Expected 4-byte multiple, got %zu", bytes);
         const size_t words = bytes/4;
 
         uint32_t hash = seed;
@@ -64,12 +78,7 @@ public:
             hash += 0xe6546b64;
         }
         hash ^= bytes;
-        hash ^= hash >> 16;
-        hash *= 0x85ebca6b;
-        hash ^= hash >> 13;
-        hash *= 0xc2b2ae35;
-        hash ^= hash >> 16;
-        return hash;
+        return Mix(hash);
     }
 
     /**
index 64603b4cb5244b423ccdf32c28c7b7bd7519a617..8a0e734b245fd7562c4d6135d8cce9e8a308be3c 100644 (file)
@@ -8,6 +8,7 @@
 #include "SkImageFilter.h"
 
 #include "SkBitmap.h"
+#include "SkChecksum.h"
 #include "SkDevice.h"
 #include "SkReadBuffer.h"
 #include "SkWriteBuffer.h"
@@ -334,31 +335,6 @@ bool SkImageFilter::getInputResultGPU(SkImageFilter::Proxy* proxy,
 }
 #endif
 
-static uint32_t compute_hash(const uint32_t* data, int count) {
-    uint32_t hash = 0;
-
-    for (int i = 0; i < count; ++i) {
-        uint32_t k = data[i];
-        k *= 0xcc9e2d51;
-        k = (k << 15) | (k >> 17);
-        k *= 0x1b873593;
-
-        hash ^= k;
-        hash = (hash << 13) | (hash >> 19);
-        hash *= 5;
-        hash += 0xe6546b64;
-    }
-
-    //    hash ^= size;
-    hash ^= hash >> 16;
-    hash *= 0x85ebca6b;
-    hash ^= hash >> 13;
-    hash *= 0xc2b2ae35;
-    hash ^= hash >> 16;
-
-    return hash;
-}
-
 class CacheImpl : public SkImageFilter::Cache {
 public:
     explicit CacheImpl(int minChildren) : fMinChildren(minChildren) {
@@ -381,7 +357,7 @@ private:
             return v.fKey;
         }
         static uint32_t Hash(Key key) {
-            return compute_hash(reinterpret_cast<const uint32_t*>(&key), sizeof(Key) / sizeof(uint32_t));
+            return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), sizeof(Key));
         }
     };
     SkTDynamicHash<Value, Key> fData;
index eda4871711157cc2d64478867b774868fe7fb58d..1e7f51dd9e851d94a6c387e258f3512637c85e3f 100644 (file)
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "SkChecksum.h"
 #include "SkScaledImageCache.h"
 #include "SkMipMap.h"
 #include "SkPixelRef.h"
@@ -29,32 +30,6 @@ static inline SkScaledImageCache::Rec* id_to_rec(SkScaledImageCache::ID* id) {
     return reinterpret_cast<SkScaledImageCache::Rec*>(id);
 }
 
- // Implemented from en.wikipedia.org/wiki/MurmurHash.
-static uint32_t compute_hash(const uint32_t data[], int count) {
-    uint32_t hash = 0;
-
-    for (int i = 0; i < count; ++i) {
-        uint32_t k = data[i];
-        k *= 0xcc9e2d51;
-        k = (k << 15) | (k >> 17);
-        k *= 0x1b873593;
-
-        hash ^= k;
-        hash = (hash << 13) | (hash >> 19);
-        hash *= 5;
-        hash += 0xe6546b64;
-    }
-
-    //    hash ^= size;
-    hash ^= hash >> 16;
-    hash *= 0x85ebca6b;
-    hash ^= hash >> 13;
-    hash *= 0xc2b2ae35;
-    hash ^= hash >> 16;
-
-    return hash;
-}
-
 struct SkScaledImageCache::Key {
     Key(uint32_t genID,
         SkScalar scaleX,
@@ -64,7 +39,7 @@ struct SkScaledImageCache::Key {
         , fScaleX(scaleX)
         , fScaleY(scaleY)
         , fBounds(bounds) {
-        fHash = compute_hash(&fGenID, 7);
+        fHash = SkChecksum::Murmur3(&fGenID, 28);
     }
 
     bool operator<(const Key& other) const {