|
@@ -98,12 +98,6 @@ uint64_t ht_default_hash(const char *str, size_t str_size);
|
|
|
_it = &_ht.items[(++_j) % _ht.cap]; \
|
|
_it = &_ht.items[(++_j) % _ht.cap]; \
|
|
|
++_ht.collisions; \
|
|
++_ht.collisions; \
|
|
|
} \
|
|
} \
|
|
|
- if ( _it->key == _hi.key ) { \
|
|
|
|
|
- printf("\n[ERROR] Unreachable\n"); \
|
|
|
|
|
- exit(0);\
|
|
|
|
|
- _it->data = _hi.data; \
|
|
|
|
|
- continue; \
|
|
|
|
|
- } \
|
|
|
|
|
DA_APPEND(_ht.keys, _hi.key); \
|
|
DA_APPEND(_ht.keys, _hi.key); \
|
|
|
_it->key_str.data = _hi.key_str.data; \
|
|
_it->key_str.data = _hi.key_str.data; \
|
|
|
_it->key_str.size = _hi.key_str.size; \
|
|
_it->key_str.size = _hi.key_str.size; \
|
|
@@ -120,11 +114,11 @@ uint64_t ht_default_hash(const char *str, size_t str_size);
|
|
|
_HT_INC_CAP(ht, UNIQUE_NAME(_ht), UNIQUE_NAME(_it), \
|
|
_HT_INC_CAP(ht, UNIQUE_NAME(_ht), UNIQUE_NAME(_it), \
|
|
|
UNIQUE_NAME(_i), UNIQUE_NAME(_j), UNIQUE_NAME(_k))
|
|
UNIQUE_NAME(_i), UNIQUE_NAME(_j), UNIQUE_NAME(_k))
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+#include <stdio.h>
|
|
|
#define _HT_SET(ht, _key, _key_size, val, _k, _it, _i) \
|
|
#define _HT_SET(ht, _key, _key_size, val, _k, _it, _i) \
|
|
|
do { \
|
|
do { \
|
|
|
- if ( (ht).size + 1 >= (ht).cap ) { \
|
|
|
|
|
- break; \
|
|
|
|
|
|
|
+ if ( (ht).size + 1 >= (ht).cap ) { \
|
|
|
|
|
+ HT_INC_CAP(ht); \
|
|
|
} \
|
|
} \
|
|
|
uint64_t _k = (ht).hash((_key), (_key_size)); \
|
|
uint64_t _k = (ht).hash((_key), (_key_size)); \
|
|
|
typeof(*(ht).items) *_it = &(ht).items[_k % (ht).cap]; \
|
|
typeof(*(ht).items) *_it = &(ht).items[_k % (ht).cap]; \
|
|
@@ -165,25 +159,36 @@ uint64_t ht_default_hash(const char *str, size_t str_size);
|
|
|
uint64_t
|
|
uint64_t
|
|
|
ht_default_hash(const char *str, size_t str_size)
|
|
ht_default_hash(const char *str, size_t str_size)
|
|
|
{
|
|
{
|
|
|
- static uint8_t _primes_list[] = {
|
|
|
|
|
- 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
|
|
|
|
|
- 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127,
|
|
|
|
|
- 131, 137, 139, 149, 151, 157, 163, 167, 173
|
|
|
|
|
- };
|
|
|
|
|
- static uint8_t _primes_list_size = 10;
|
|
|
|
|
- uint64_t max = UINT64_MAX >> 1;
|
|
|
|
|
- uint64_t ret = 1;
|
|
|
|
|
- uint8_t p = 0;
|
|
|
|
|
- size_t i = 0;
|
|
|
|
|
- uint8_t b = 0;
|
|
|
|
|
-
|
|
|
|
|
- for ( i = 0; i < str_size; ++i ) {
|
|
|
|
|
- b = (uint8_t)str[i];
|
|
|
|
|
- p = _primes_list[(i + b) % _primes_list_size];
|
|
|
|
|
- ret = (ret * (b * p)) % max;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- return ret;
|
|
|
|
|
|
|
+ uint64_t k = (uint64_t)((char)str[0]) << 56;
|
|
|
|
|
+ k |= (((uint64_t) (str[1 * (str_size > 1)])) << 48);
|
|
|
|
|
+ k |= (((uint64_t) (str[2 * (str_size > 2)])) << 40);
|
|
|
|
|
+ k |= (((uint64_t) (str[3 * (str_size > 3)])) << 32);
|
|
|
|
|
+ k |= (((uint64_t) (str[(str_size-4) * (str_size >= 4)])) << 24);
|
|
|
|
|
+ k |= (((uint64_t) (str[(str_size-3) * (str_size >= 3)])) << 16);
|
|
|
|
|
+ k |= (((uint64_t) (str[(str_size-2) * (str_size >= 2)])) << 8);
|
|
|
|
|
+ k |= (((uint64_t) (str[(str_size-1) * (str_size >= 1)])) << 0);
|
|
|
|
|
+ return k + ((uint64_t)str[4 * (str_size > 4)] * 31)
|
|
|
|
|
+ + ((uint64_t)str[(str_size-5) * (str_size >= 5)] * 13)
|
|
|
|
|
+ + ((uint64_t)str[str_size/2] * 41);
|
|
|
|
|
+ /* static uint8_t _primes_list[] = { */
|
|
|
|
|
+ /* 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, */
|
|
|
|
|
+ /* 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, */
|
|
|
|
|
+ /* 131, 137, 139, 149, 151, 157, 163, 167, 173 */
|
|
|
|
|
+ /* }; */
|
|
|
|
|
+ /* static uint8_t _primes_list_size = 8; */
|
|
|
|
|
+ /* uint64_t max = UINT64_MAX >> 1; */
|
|
|
|
|
+ /* uint64_t ret = 1; */
|
|
|
|
|
+ /* uint8_t p = 0; */
|
|
|
|
|
+ /* size_t i = 0; */
|
|
|
|
|
+ /* uint8_t b = 0; */
|
|
|
|
|
+
|
|
|
|
|
+ /* for ( i = 0; i < str_size; ++i ) { */
|
|
|
|
|
+ /* b = (uint8_t)str[i]; */
|
|
|
|
|
+ /* p = _primes_list[(i + b) & _primes_list_size]; */
|
|
|
|
|
+ /* ret = (ret * (b * p)) % max; */
|
|
|
|
|
+ /* } */
|
|
|
|
|
+
|
|
|
|
|
+ /* return ret; */
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|