Igor Sysoev | 42f1e1c | 2011-04-15 10:59:24 +0000 | [diff] [blame] | 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 | } |