Skip to content

Commit

Permalink
lib: Make htable bucket size configurable.
Browse files Browse the repository at this point in the history
Until now the size of the htable bucket linked list is always set to 4
which is probably not to great for bigger hashtables. Linear searching
the bucket nowadays doesn't cost much and the hash will partition the
result set already quite a bit.
  • Loading branch information
Marco van Wieringen committed Apr 27, 2016
1 parent f0de1f7 commit 0d2d1ce
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 6 deletions.
8 changes: 4 additions & 4 deletions src/lib/htable.c
Expand Up @@ -167,12 +167,12 @@ void htable::hash_index(uint8_t *key, uint32_t keylen)
/*
* tsize is the estimated number of entries in the hash table
*/
htable::htable(void *item, void *link, int tsize, int nr_pages)
htable::htable(void *item, void *link, int tsize, int nr_pages, int nr_entries)
{
init(item, link, tsize, nr_pages);
init(item, link, tsize, nr_pages, nr_entries);
}

void htable::init(void *item, void *link, int tsize, int nr_pages)
void htable::init(void *item, void *link, int tsize, int nr_pages, int nr_entries)
{
int pwr;
int pagesize;
Expand All @@ -190,7 +190,7 @@ void htable::init(void *item, void *link, int tsize, int nr_pages)
mask = ~((~0) << pwr); /* 3 bits => table size = 8 */
rshift = 30 - pwr; /* Start using bits 28, 29, 30 */
buckets = 1 << pwr; /* Hash table size -- power of two */
max_items = buckets * 4; /* Allow average 4 entries per chain */
max_items = buckets * nr_entries; /* Allow average nr_entries entries per chain */
table = (hlink **)malloc(buckets * sizeof(hlink *));
memset(table, 0, buckets * sizeof(hlink *));

Expand Down
6 changes: 4 additions & 2 deletions src/lib/htable.h
Expand Up @@ -98,9 +98,11 @@ class htable : public SMARTALLOC {
void grow_table(); /* Grow the table */

public:
htable(void *item, void *link, int tsize = 31, int nr_pages = 0);
htable(void *item, void *link, int tsize = 31,
int nr_pages = 0, int nr_entries = 4);
~htable() { destroy(); }
void init(void *item, void *link, int tsize = 31, int nr_pages = 0);
void init(void *item, void *link, int tsize = 31,
int nr_pages = 0, int nr_entries = 4);
bool insert(char *key, void *item);
bool insert(uint32_t key, void *item);
bool insert(uint64_t key, void *item);
Expand Down

0 comments on commit 0d2d1ce

Please sign in to comment.