Переглянути джерело

Minor internal improvements to gravity_hash_table

Marco Bambini 6 роки тому
батько
коміт
50a8299544
2 змінених файлів з 7 додано та 4 видалено
  1. 6 4
      src/shared/gravity_hash.c
  2. 1 0
      src/shared/gravity_hash.h

+ 6 - 4
src/shared/gravity_hash.c

@@ -160,7 +160,7 @@ static void table_dump (gravity_hash_t *hashtable, gravity_value_t key, gravity_
 
 gravity_hash_t *gravity_hash_create (uint32_t size, gravity_hash_compute_fn compute, gravity_hash_isequal_fn isequal, gravity_hash_iterate_fn free_fn, void *data) {
     if ((!compute) || (!isequal)) return NULL;
-    if (size == 0) size = GRAVITYHASH_DEFAULT_SIZE;
+    if (size < GRAVITYHASH_DEFAULT_SIZE) size = GRAVITYHASH_DEFAULT_SIZE;
 
     gravity_hash_t *hashtable = (gravity_hash_t *)mem_alloc(NULL, sizeof(gravity_hash_t));
     if (!hashtable) return NULL;
@@ -204,7 +204,7 @@ bool gravity_hash_isempty (gravity_hash_t *hashtable) {
 }
 
 static inline int gravity_hash_resize (gravity_hash_t *hashtable) {
-    uint32_t size = (hashtable->size * 2) + 1;
+    uint32_t size = (hashtable->size * 2);
     gravity_hash_t newtbl = {
         .size = size,
         .count = 0,
@@ -261,6 +261,8 @@ bool gravity_hash_remove (gravity_hash_t *hashtable, gravity_value_t key) {
 }
 
 bool gravity_hash_insert (gravity_hash_t *hashtable, gravity_value_t key, gravity_value_t value) {
+    if (hashtable->count >= GRAVITYHASH_MAXENTRIES) return false;
+    
     register uint32_t hash = hashtable->compute_fn(key);
     register uint32_t position = hash % hashtable->size;
 
@@ -279,13 +281,13 @@ bool gravity_hash_insert (gravity_hash_t *hashtable, gravity_value_t key, gravit
     // resize table if the threshold is exceeded
     // default threshold is: <table size> * <load factor GRAVITYHASH_THRESHOLD>
     if (hashtable->count >= hashtable->size * GRAVITYHASH_THRESHOLD) {
-        if (gravity_hash_resize(hashtable) == -1) return -1;
+        if (gravity_hash_resize(hashtable) == -1) return false;
         // recompute position here because hashtable->size has changed!
         position = hash % hashtable->size;
     }
 
     // allocate new entry and set new data
-    if (!(node = mem_alloc(NULL, sizeof(hash_node_t)))) return -1;
+    if (!(node = mem_alloc(NULL, sizeof(hash_node_t)))) return false;
     node->key = key;
     node->hash = hash;
     node->value = value;

+ 1 - 0
src/shared/gravity_hash.h

@@ -18,6 +18,7 @@
 #define GRAVITYHASH_ENABLE_STATS    1               // if 0 then stats are not enabled
 #define GRAVITYHASH_DEFAULT_SIZE    32              // default hash table size (used if 0 is passed in gravity_hash_create)
 #define GRAVITYHASH_THRESHOLD       0.75            // threshold used to decide when re-hash the table
+#define GRAVITYHASH_MAXENTRIES      1073741824      // please don't put more than 1 billion values in my hash table (2^30)
 
 #ifndef GRAVITY_HASH_DEFINED
 #define GRAVITY_HASH_DEFINED