|
@@ -105,8 +105,7 @@ typedef unsigned char uint8_t;
|
|
|
|
|
|
#define HASH_VALUE(keyptr,keylen,hashv) \
|
|
#define HASH_VALUE(keyptr,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
- unsigned _hf_bkt; \
|
|
|
|
- HASH_FCN(keyptr,keylen,1,hashv,_hf_bkt); \
|
|
|
|
|
|
+ HASH_FCN(keyptr, keylen, hashv); \
|
|
} while (0)
|
|
} while (0)
|
|
|
|
|
|
#define HASH_FIND(hh,head,keyptr,keylen,out) \
|
|
#define HASH_FIND(hh,head,keyptr,keylen,out) \
|
|
@@ -114,7 +113,8 @@ do {
|
|
out=NULL; \
|
|
out=NULL; \
|
|
if (head != NULL) { \
|
|
if (head != NULL) { \
|
|
unsigned _hf_bkt,_hf_hashv; \
|
|
unsigned _hf_bkt,_hf_hashv; \
|
|
- HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt); \
|
|
|
|
|
|
+ HASH_FCN(keyptr, keylen, _hf_hashv); \
|
|
|
|
+ HASH_TO_BKT(_hf_hashv, (head)->hh.tbl->num_buckets, _hf_bkt); \
|
|
if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv) != 0) { \
|
|
if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv) != 0) { \
|
|
HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \
|
|
HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], \
|
|
keyptr,keylen,out); \
|
|
keyptr,keylen,out); \
|
|
@@ -228,8 +228,8 @@ do {
|
|
} \
|
|
} \
|
|
(head)->hh.tbl->num_items++; \
|
|
(head)->hh.tbl->num_items++; \
|
|
(add)->hh.tbl = (head)->hh.tbl; \
|
|
(add)->hh.tbl = (head)->hh.tbl; \
|
|
- HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets, \
|
|
|
|
- (add)->hh.hashv, _ha_bkt); \
|
|
|
|
|
|
+ HASH_FCN(keyptr, keylen_in, (add)->hh.hashv); \
|
|
|
|
+ HASH_TO_BKT((add)->hh.hashv, (head)->hh.tbl->num_buckets, _ha_bkt); \
|
|
HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \
|
|
HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh); \
|
|
HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \
|
|
HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv); \
|
|
HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \
|
|
HASH_EMIT_KEY(hh,head,keyptr,keylen_in); \
|
|
@@ -418,7 +418,7 @@ do {
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */
|
|
/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */
|
|
-#define HASH_BER(key,keylen,num_bkts,hashv,bkt) \
|
|
|
|
|
|
+#define HASH_BER(key,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
unsigned _hb_keylen=(unsigned)keylen; \
|
|
unsigned _hb_keylen=(unsigned)keylen; \
|
|
const unsigned char *_hb_key=(const unsigned char*)(key); \
|
|
const unsigned char *_hb_key=(const unsigned char*)(key); \
|
|
@@ -426,13 +426,12 @@ do {
|
|
while (_hb_keylen-- != 0U) { \
|
|
while (_hb_keylen-- != 0U) { \
|
|
(hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \
|
|
(hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \
|
|
} \
|
|
} \
|
|
- bkt = (hashv) & (num_bkts-1U); \
|
|
|
|
} while (0)
|
|
} while (0)
|
|
|
|
|
|
|
|
|
|
/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at
|
|
/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at
|
|
* http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */
|
|
* http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */
|
|
-#define HASH_SAX(key,keylen,num_bkts,hashv,bkt) \
|
|
|
|
|
|
+#define HASH_SAX(key,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
unsigned _sx_i; \
|
|
unsigned _sx_i; \
|
|
const unsigned char *_hs_key=(const unsigned char*)(key); \
|
|
const unsigned char *_hs_key=(const unsigned char*)(key); \
|
|
@@ -440,10 +439,9 @@ do {
|
|
for(_sx_i=0; _sx_i < keylen; _sx_i++) { \
|
|
for(_sx_i=0; _sx_i < keylen; _sx_i++) { \
|
|
hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \
|
|
hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \
|
|
} \
|
|
} \
|
|
- bkt = hashv & (num_bkts-1U); \
|
|
|
|
} while (0)
|
|
} while (0)
|
|
/* FNV-1a variation */
|
|
/* FNV-1a variation */
|
|
-#define HASH_FNV(key,keylen,num_bkts,hashv,bkt) \
|
|
|
|
|
|
+#define HASH_FNV(key,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
unsigned _fn_i; \
|
|
unsigned _fn_i; \
|
|
const unsigned char *_hf_key=(const unsigned char*)(key); \
|
|
const unsigned char *_hf_key=(const unsigned char*)(key); \
|
|
@@ -452,10 +450,9 @@ do {
|
|
hashv = hashv ^ _hf_key[_fn_i]; \
|
|
hashv = hashv ^ _hf_key[_fn_i]; \
|
|
hashv = hashv * 16777619U; \
|
|
hashv = hashv * 16777619U; \
|
|
} \
|
|
} \
|
|
- bkt = hashv & (num_bkts-1U); \
|
|
|
|
} while(0)
|
|
} while(0)
|
|
|
|
|
|
-#define HASH_OAT(key,keylen,num_bkts,hashv,bkt) \
|
|
|
|
|
|
+#define HASH_OAT(key,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
unsigned _ho_i; \
|
|
unsigned _ho_i; \
|
|
const unsigned char *_ho_key=(const unsigned char*)(key); \
|
|
const unsigned char *_ho_key=(const unsigned char*)(key); \
|
|
@@ -468,7 +465,6 @@ do {
|
|
hashv += (hashv << 3); \
|
|
hashv += (hashv << 3); \
|
|
hashv ^= (hashv >> 11); \
|
|
hashv ^= (hashv >> 11); \
|
|
hashv += (hashv << 15); \
|
|
hashv += (hashv << 15); \
|
|
- bkt = hashv & (num_bkts-1U); \
|
|
|
|
} while(0)
|
|
} while(0)
|
|
|
|
|
|
#define HASH_JEN_MIX(a,b,c) \
|
|
#define HASH_JEN_MIX(a,b,c) \
|
|
@@ -484,7 +480,7 @@ do {
|
|
c -= a; c -= b; c ^= ( b >> 15 ); \
|
|
c -= a; c -= b; c ^= ( b >> 15 ); \
|
|
} while (0)
|
|
} while (0)
|
|
|
|
|
|
-#define HASH_JEN(key,keylen,num_bkts,hashv,bkt) \
|
|
|
|
|
|
+#define HASH_JEN(key,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
unsigned _hj_i,_hj_j,_hj_k; \
|
|
unsigned _hj_i,_hj_j,_hj_k; \
|
|
unsigned const char *_hj_key=(unsigned const char*)(key); \
|
|
unsigned const char *_hj_key=(unsigned const char*)(key); \
|
|
@@ -522,7 +518,6 @@ do {
|
|
case 1: _hj_i += _hj_key[0]; \
|
|
case 1: _hj_i += _hj_key[0]; \
|
|
} \
|
|
} \
|
|
HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
|
|
HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
|
|
- bkt = hashv & (num_bkts-1U); \
|
|
|
|
} while(0)
|
|
} while(0)
|
|
|
|
|
|
/* The Paul Hsieh hash function */
|
|
/* The Paul Hsieh hash function */
|
|
@@ -536,7 +531,7 @@ do {
|
|
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \
|
|
#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \
|
|
+(uint32_t)(((const uint8_t *)(d))[0]) )
|
|
+(uint32_t)(((const uint8_t *)(d))[0]) )
|
|
#endif
|
|
#endif
|
|
-#define HASH_SFH(key,keylen,num_bkts,hashv,bkt) \
|
|
|
|
|
|
+#define HASH_SFH(key,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
unsigned const char *_sfh_key=(unsigned const char*)(key); \
|
|
unsigned const char *_sfh_key=(unsigned const char*)(key); \
|
|
uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \
|
|
uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \
|
|
@@ -577,7 +572,6 @@ do {
|
|
hashv += hashv >> 17; \
|
|
hashv += hashv >> 17; \
|
|
hashv ^= hashv << 25; \
|
|
hashv ^= hashv << 25; \
|
|
hashv += hashv >> 6; \
|
|
hashv += hashv >> 6; \
|
|
- bkt = hashv & (num_bkts-1U); \
|
|
|
|
} while(0)
|
|
} while(0)
|
|
|
|
|
|
#ifdef HASH_USING_NO_STRICT_ALIASING
|
|
#ifdef HASH_USING_NO_STRICT_ALIASING
|
|
@@ -622,7 +616,7 @@ do { \
|
|
_h ^= _h >> 16; \
|
|
_h ^= _h >> 16; \
|
|
} while(0)
|
|
} while(0)
|
|
|
|
|
|
-#define HASH_MUR(key,keylen,num_bkts,hashv,bkt) \
|
|
|
|
|
|
+#define HASH_MUR(key,keylen,hashv) \
|
|
do { \
|
|
do { \
|
|
const uint8_t *_mur_data = (const uint8_t*)(key); \
|
|
const uint8_t *_mur_data = (const uint8_t*)(key); \
|
|
const int _mur_nblocks = (int)(keylen) / 4; \
|
|
const int _mur_nblocks = (int)(keylen) / 4; \
|
|
@@ -657,7 +651,6 @@ do { \
|
|
_mur_h1 ^= (uint32_t)(keylen); \
|
|
_mur_h1 ^= (uint32_t)(keylen); \
|
|
MUR_FMIX(_mur_h1); \
|
|
MUR_FMIX(_mur_h1); \
|
|
hashv = _mur_h1; \
|
|
hashv = _mur_h1; \
|
|
- bkt = hashv & (num_bkts-1U); \
|
|
|
|
} while(0)
|
|
} while(0)
|
|
#endif /* HASH_USING_NO_STRICT_ALIASING */
|
|
#endif /* HASH_USING_NO_STRICT_ALIASING */
|
|
|
|
|