#include #include #include struct item { const char blob[32]; struct hlist_node node; }; struct item items[] = { { "blob one", }, { "blob two and five are the same", }, { "third blob", }, { "fourth blob", }, { "blob two and five are the same", }, }; uint32_t item_hash(const struct item *item) { return osmo_jhash(item->blob, strlen(item->blob), 0); } int main(void) { int i; struct item *item; DECLARE_HASHTABLE(haystack, 5); hash_init(haystack); printf("add:\n"); for (i = 0; i < ARRAY_SIZE(items); i++) { uint32_t hash; item = &items[i]; hash_add(haystack, &item->node, hash = item_hash(item)); printf("- adding items[%d]#%x = %s\n", i, hash, item->blob); } printf("list:\n"); hash_for_each (haystack, i, item, node) printf("- %s [%d]\n", item->blob, (int)(item - items)); printf("find:\n"); for (i = 0; i < ARRAY_SIZE(items); i++) { uint32_t hash; struct item *needle = &items[i]; hash = item_hash(needle); printf("- looking up items[%d]#%x = %s\n", i, hash, needle->blob); hash_for_each_possible (haystack, item, node, hash) printf(" - %s items[%d]\n", (item == needle) ? "found" : "not", (int)(item - items)); } return 0; }