add blobmsg_for_each_attr
[project/libubox.git] / hash.c
1 #include <stdint.h>
2 #include <stdlib.h>
3 #include "hash.h"
4
5 //-----------------------------------------------------------------------------
6 // MurmurHashNeutral2, by Austin Appleby
7
8 // Same as MurmurHash2, but endian- and alignment-neutral.
9 uint32_t hash_murmur2(const void * key, int len)
10 {
11         const unsigned int seed = 0xdeadc0de;
12         const unsigned int m = 0x5bd1e995;
13         const int r = 24;
14
15         unsigned int h = seed ^ len;
16
17         const unsigned char * data = (const unsigned char *)key;
18
19         while(len >= 4)
20         {
21                 unsigned int k;
22
23                 k  = data[0];
24                 k |= data[1] << 8;
25                 k |= data[2] << 16;
26                 k |= data[3] << 24;
27
28                 k *= m;
29                 k ^= k >> r;
30                 k *= m;
31
32                 h *= m;
33                 h ^= k;
34
35                 data += 4;
36                 len -= 4;
37         }
38
39         switch(len)
40         {
41         case 3: h ^= data[2] << 16;
42         case 2: h ^= data[1] << 8;
43         case 1: h ^= data[0];
44                 h *= m;
45         };
46
47         h ^= h >> 13;
48         h *= m;
49         h ^= h >> 15;
50
51         return h;
52 }
53
54