Hashmap implemented using linear probing and FNV-1 hash function.
PROGRAM
β
ββββββββββββββββΌβββββββββββββββ
β β β
βΌ βΌ βΌ
mapSet() mapGet() mapDelete()
β β β
β β β
β βΌ βΌ
β findEntry() findEntry()
β β β
β β β
β βΌ βΌ
β compareKey() compareKey()
β
β
βΌ
findEntry()
β
βΌ
compareKey()
hash = 2166136261
for each byte:
hash ^= byte
hash *= 16777619
start_index = hash & (capacity - 1)
loop:
entry = entries[index]
if entry empty
return entry
if keys match
return entry
index = (index + 1) & (capacity - 1)Before
------
[ A ][ B ][ C ][ ][ D ]
After Resize
------------
[ ][ A ][ ][ B ][ C ][ ][ D ][ ]
mapSet()
- compute hash
- find slot using probing
- insert or overwrite
Average: O(1) Worst: O(n)
mapSet()
βββ growMap()
β βββ malloc()
β βββ memset()
β βββ findEntry()
β β βββ compareKey()
β βββ free()
β
βββ findEntry()
βββ compareKey()
mapGet()
Steps:
- compute hash
- probe until: key found OR empty bucket
If empty bucket reached: key not present
mapGet()
βββ findEntry()
βββ compareKey()
mapDelete()
Deletion does not clear the slot, but changes it to:
NULL : TOMBSTONE because removing it entirely would break probe chains.
Before
A β B β C
After Delete B
A β NULL : TOMBSTONE β C
mapDelete()
βββ findEntry()
βββ compareKey()