1
/* By Paul Hsieh (C) 2004, 2005. Covered under the Paul Hsieh
3
* See: http://www.azillionmonkeys.com/qed/weblicense.html for license
5
* http://www.azillionmonkeys.com/qed/hash.html
8
#include "hash_common.h"
11
#if (defined(__GNUC__) && defined(__i386__))
12
#define get16bits(d) (*((const uint16_t *) (d)))
15
#if !defined (get16bits)
16
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
17
+(uint32_t)(((const uint8_t *)(d))[0]) )
20
uint32_t hashkit_hsieh(const char *key, size_t key_length)
22
uint32_t hash = 0, tmp;
25
if (key_length <= 0 || key == NULL)
32
for (;key_length > 0; key_length--)
34
hash += get16bits (key);
35
tmp = (get16bits (key+2) << 11) ^ hash;
36
hash = (hash << 16) ^ tmp;
37
key += 2*sizeof (uint16_t);
41
/* Handle end cases */
44
case 3: hash += get16bits (key);
46
hash ^= key[sizeof (uint16_t)] << 18;
49
case 2: hash += get16bits (key);
58
/* Force "avalanching" of final 127 bits */