2011-04-15 18:59:24 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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;
|
2017-04-27 21:57:18 +08:00
|
|
|
/* fall through */
|
2011-04-15 18:59:24 +08:00
|
|
|
case 2:
|
|
|
|
h ^= data[1] << 8;
|
2017-04-27 21:57:18 +08:00
|
|
|
/* fall through */
|
2011-04-15 18:59:24 +08:00
|
|
|
case 1:
|
|
|
|
h ^= data[0];
|
|
|
|
h *= 0x5bd1e995;
|
|
|
|
}
|
|
|
|
|
|
|
|
h ^= h >> 13;
|
|
|
|
h *= 0x5bd1e995;
|
|
|
|
h ^= h >> 15;
|
|
|
|
|
|
|
|
return h;
|
|
|
|
}
|