diff options
Diffstat (limited to 'ht.c')
-rw-r--r-- | ht.c | 8 |
1 files changed, 5 insertions, 3 deletions
@@ -24,15 +24,17 @@ Ht ht_new() { } static HtEntry *find(HtEntry *b, size_t cap, ObjString *k) { - size_t ix = k->hash % cap; + // cap is guaranteed to be power of 2 + size_t mask = cap - 1; + size_t ix = k->hash & mask; if (cap == 0) return NULL; for (;;) { HtEntry *ent = &b[ix]; // XXX tombstones - if (ent->k == k || ent->k == NULL) { + if (ent->k == NULL || ent->k == k) { return ent; } - ix = (ix+1)%cap; + ix = (ix+1) & mask; } } |