Quellcode durchsuchen

[ht.h] Good Enough

Vinicius Teshima vor 1 Jahr
Ursprung
Commit
d1ef42ea61
1 geänderte Dateien mit 33 neuen und 28 gelöschten Zeilen
  1. 33 28
      src/ht.h

+ 33 - 28
src/ht.h

@@ -98,12 +98,6 @@ uint64_t ht_default_hash(const char *str, size_t str_size);
 				_it = &_ht.items[(++_j) % _ht.cap];	\
 				++_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);			\
 			_it->key_str.data = _hi.key_str.data;		\
 			_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),	\
 		    UNIQUE_NAME(_i), UNIQUE_NAME(_j), UNIQUE_NAME(_k))
 
-
+#include <stdio.h>
 #define _HT_SET(ht, _key, _key_size, val, _k, _it, _i)			\
 	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));		\
 		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
 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; */
 }