#include #include #define HASH_FUNCTION(s, len, hashv) (hashv) = TrivialHash((const char *)s, len) #include "uthash.h" unsigned int TrivialHash(const char *s, size_t len) { unsigned int h = 0; size_t i; for (i=0; i < len; ++i) { h += (unsigned char)s[i]; } return h; } struct test_t { int a; int b; UT_hash_handle hh; }; struct test_t *make_test(int value) { struct test_t *test = (struct test_t *)malloc(sizeof *test); assert(test != NULL); test->a = value; return test; } int main() { struct test_t *tests = NULL; struct test_t *test = NULL; int x; unsigned int h; x = 0x0042; HASH_VALUE(&x, sizeof x, h); assert(h == 0x42); x = 0x4002; HASH_VALUE(&x, sizeof x, h); assert(h == 0x42); test = make_test(0x0042); HASH_ADD_INT(tests, a, test); test = make_test(0x4002); HASH_ADD_INT(tests, a, test); x = 0x4002; test = NULL; HASH_FIND_BYHASHVALUE(hh, tests, &x, sizeof x, 0x42, test); assert(test != NULL); assert(test->a == 0x4002); x = 0x0042; test = NULL; HASH_FIND_BYHASHVALUE(hh, tests, &x, sizeof x, 0x42, test); assert(test != NULL); assert(test->a == 0x0042); x = 0x4002; test = NULL; HASH_FIND_BYHASHVALUE(hh, tests, &x, sizeof x, 0x43, test); assert(test == NULL); x = 0x0042; test = NULL; HASH_FIND_BYHASHVALUE(hh, tests, &x, sizeof x, 0x43, test); assert(test == NULL); x = 0x4003; test = NULL; HASH_FIND_BYHASHVALUE(hh, tests, &x, sizeof x, 0x42, test); assert(test == NULL); HASH_CLEAR(hh, tests); }