/* | |
* Copyright (C) Austin Appleby | |
*/ | |
#include <ngx_config.h> | |
#include <ngx_core.h> | |
uint32_t | |
ngx_murmur_hash2(u_char *data, size_t len) | |
{ | |
uint32_t h, k; | |
h = 0 ^ len; | |
while (len >= 4) { | |
k = data[0]; | |
k |= data[1] << 8; | |
k |= data[2] << 16; | |
k |= data[3] << 24; | |
k *= 0x5bd1e995; | |
k ^= k >> 24; | |
k *= 0x5bd1e995; | |
h *= 0x5bd1e995; | |
h ^= k; | |
data += 4; | |
len -= 4; | |
} | |
switch (len) { | |
case 3: | |
h ^= data[2] << 16; | |
case 2: | |
h ^= data[1] << 8; | |
case 1: | |
h ^= data[0]; | |
h *= 0x5bd1e995; | |
} | |
h ^= h >> 13; | |
h *= 0x5bd1e995; | |
h ^= h >> 15; | |
return h; | |
} |