• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkChecksum_DEFINED
9 #define SkChecksum_DEFINED
10 
11 #include "include/core/SkString.h"
12 #include "include/core/SkTypes.h"
13 #include "include/private/SkNoncopyable.h"
14 #include "include/private/SkOpts_spi.h"
15 #include "include/private/SkTLogic.h"
16 
17 class SkChecksum : SkNoncopyable {
18 public:
19     /**
20      * uint32_t -> uint32_t hash, useful for when you're about to trucate this hash but you
21      * suspect its low bits aren't well mixed.
22      *
23      * This is the Murmur3 finalizer.
24      */
Mix(uint32_t hash)25     static uint32_t Mix(uint32_t hash) {
26         hash ^= hash >> 16;
27         hash *= 0x85ebca6b;
28         hash ^= hash >> 13;
29         hash *= 0xc2b2ae35;
30         hash ^= hash >> 16;
31         return hash;
32     }
33 
34     /**
35      * uint32_t -> uint32_t hash, useful for when you're about to trucate this hash but you
36      * suspect its low bits aren't well mixed.
37      *
38      *  This version is 2-lines cheaper than Mix, but seems to be sufficient for the font cache.
39      */
CheapMix(uint32_t hash)40     static uint32_t CheapMix(uint32_t hash) {
41         hash ^= hash >> 16;
42         hash *= 0x85ebca6b;
43         hash ^= hash >> 16;
44         return hash;
45     }
46 };
47 
48 // SkGoodHash should usually be your first choice in hashing data.
49 // It should be both reasonably fast and high quality.
50 struct SkGoodHash {
51     template <typename K>
operatorSkGoodHash52     std::enable_if_t<sizeof(K) == 4, uint32_t> operator()(const K& k) const {
53         return SkChecksum::Mix(*(const uint32_t*)&k);
54     }
55 
56     template <typename K>
operatorSkGoodHash57     std::enable_if_t<sizeof(K) != 4, uint32_t> operator()(const K& k) const {
58         return SkOpts::hash_fn(&k, sizeof(K), 0);
59     }
60 
operatorSkGoodHash61     uint32_t operator()(const SkString& k) const {
62         return SkOpts::hash_fn(k.c_str(), k.size(), 0);
63     }
64 };
65 
66 #endif
67