3891
|
1
|
|
2 /*
|
|
3 * Copyright (C) Austin Appleby
|
|
4 */
|
|
5
|
|
6
|
|
7 #include <ngx_config.h>
|
|
8 #include <ngx_core.h>
|
|
9
|
|
10
|
|
11 uint32_t
|
|
12 ngx_murmur_hash2(u_char *data, size_t len)
|
|
13 {
|
|
14 uint32_t h, k;
|
|
15
|
|
16 h = 0 ^ len;
|
|
17
|
|
18 while (len >= 4) {
|
|
19 k = data[0];
|
|
20 k |= data[1] << 8;
|
|
21 k |= data[2] << 16;
|
|
22 k |= data[3] << 24;
|
|
23
|
|
24 k *= 0x5bd1e995;
|
|
25 k ^= k >> 24;
|
|
26 k *= 0x5bd1e995;
|
|
27
|
|
28 h *= 0x5bd1e995;
|
|
29 h ^= k;
|
|
30
|
|
31 data += 4;
|
|
32 len -= 4;
|
|
33 }
|
|
34
|
|
35 switch (len) {
|
|
36 case 3:
|
|
37 h ^= data[2] << 16;
|
|
38 case 2:
|
|
39 h ^= data[1] << 8;
|
|
40 case 1:
|
|
41 h ^= data[0];
|
|
42 h *= 0x5bd1e995;
|
|
43 }
|
|
44
|
|
45 h ^= h >> 13;
|
|
46 h *= 0x5bd1e995;
|
|
47 h ^= h >> 15;
|
|
48
|
|
49 return h;
|
|
50 }
|