#include #include // Someone complained that it was unreasonable to expect them to // implement a hash table in C on a whiteboard in 30 minutes, so I // wrote this in 15 minutes. // https://news.ycombinator.com/item?id=26595520 enum { table_size = 1024 }; typedef struct item { int k, v, full; } item; static item table[table_size]; void put(item kv) { // dumbest possible hash function size_t orig = (size_t)kv.k % table_size; size_t b = (orig + 1) % table_size; // use linear probing for collisions while (table[b].full && table[b].k != kv.k && b != orig) { b = (b + 1) % table_size; } if (b == orig) abort(); // table full table[b] = kv; table[b].full = 1; } item *get(int k) { size_t orig = (size_t)k % table_size; size_t b = (orig + 1) % table_size; while (table[b].full && table[b].k != k && b != orig) { b = (b + 1) % table_size; } return (table[b].full && table[b].k == k) ? &table[b] : NULL; } int main() { put((item) { 4, 7 }); put((item) { 1028, 9 }); put((item) { 3, 25 }); printf("%d %d %d %p %p\n", get(4)->v, get(1028)->v, get(3)->v, get(5), get(3)); put((item) { 4, 8 }); printf("%d %d %d %p %p\n", get(4)->v, get(1028)->v, get(3)->v, get(5), get(3)); put((item) { -10280000, 90 }); return 0; }