Imported Upstream version 3.7
[platform/upstream/ccache.git] / src / murmurhashneutral2.c
1 // MurmurHashNeutral2, by Austin Appleby. Released to the public domain. See
2 // <http://murmurhash.googlepages.com>.
3
4 #include "murmurhashneutral2.h"
5
6 unsigned int
7 murmurhashneutral2(const void *key, int len, unsigned int seed)
8 {
9         const unsigned int m = 0x5bd1e995;
10         const int r = 24;
11         unsigned int h = seed ^ len;
12         const unsigned char *data = (const unsigned char *)key;
13
14         while (len >= 4) {
15                 unsigned int k = data[0];
16                 k |= ((unsigned int) data[1]) << 8;
17                 k |= ((unsigned int) data[2]) << 16;
18                 k |= ((unsigned int) data[3]) << 24;
19
20                 k *= m;
21                 k ^= k >> r;
22                 k *= m;
23
24                 h *= m;
25                 h ^= k;
26
27                 data += 4;
28                 len -= 4;
29         }
30
31         switch (len)
32         {
33         case 3: h ^= ((unsigned int) data[2]) << 16; // Fallthrough.
34         case 2: h ^= ((unsigned int) data[1]) << 8; // Fallthrough.
35         case 1: h ^= ((unsigned int) data[0]);
36                 h *= m;
37         };
38
39         h ^= h >> 13;
40         h *= m;
41         h ^= h >> 15;
42
43         return h;
44 }