ngx_murmurhash.c revision e18a033b
1
2/*
3 * Copyright (C) Austin Appleby
4 */
5
6
7#include <ngx_config.h>
8#include <ngx_core.h>
9
10
11uint32_t
12ngx_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}
51