blobmsg: fix dynamic string buffer length calculation
[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