41 #define ZHASH_FACTOR_CRITICAL 2 44 #define ZHASH_FACTOR_REALLOC 4 51 uint32_t(*
hash)(
const void *a);
54 int(*
equals)(
const void *a,
const void *b);
63 uint32_t(*
hash)(
const void *a),
int(*
equals)(
const void *a,
const void*b),
76 if ((nentries & (nentries - 1)) != 0) {
78 while (nentries < _nentries)
98 uint32_t(*
hash)(
const void *a),
int(*
equals)(
const void *a,
const void *b))
125 uint32_t code = zh->
hash(key);
126 uint32_t entry_idx = code & (zh->
nentries - 1);
130 if (zh->
equals(key, this_key)) {
135 entry_idx = (entry_idx + 1) & (zh->
nentries - 1);
145 memcpy(out_value, tmp, zh->
valuesz);
152 int zhash_put(
zhash_t *zh,
const void *key,
const void *value,
void *oldkey,
void *oldvalue)
154 uint32_t code = zh->
hash(key);
155 uint32_t entry_idx = code & (zh->
nentries - 1);
161 if (zh->
equals(key, this_key)) {
164 memcpy(oldkey, this_key, zh->
keysz);
166 memcpy(oldvalue, this_value, zh->
valuesz);
167 memcpy(this_key, key, zh->
keysz);
168 memcpy(this_value, value, zh->
valuesz);
173 entry_idx = (entry_idx + 1) & (zh->
nentries - 1);
187 for (
int entry_idx = 0; entry_idx < zh->
nentries; entry_idx++) {
192 if (
zhash_put(newhash, this_key, this_value, NULL, NULL))
199 memcpy(&tmp, zh,
sizeof(
zhash_t));
200 memcpy(zh, newhash,
sizeof(
zhash_t));
201 memcpy(newhash, &tmp,
sizeof(
zhash_t));
210 uint32_t code = zh->
hash(key);
211 uint32_t entry_idx = code & (zh->
nentries - 1);
217 if (zh->
equals(key, this_key)) {
219 memcpy(old_key, this_key, zh->
keysz);
221 memcpy(old_value, this_value, zh->
valuesz);
229 entry_idx = (entry_idx + 1) & (zh->
nentries - 1);
247 entry_idx = (entry_idx + 1) & (zh->
nentries - 1);
259 for (
int entry_idx = 0; entry_idx < zh->
nentries; entry_idx++) {
263 if (
zhash_put(newhash, this_key, this_value, NULL, NULL))
306 *((
void**) outkey) = this_key;
307 if (outvalue != NULL)
308 *((
void**) outvalue) = this_value;
319 void *outkeyp, *outvaluep;
325 memcpy(outkey, outkeyp, zh->
keysz);
326 if (outvalue != NULL)
327 memcpy(outvalue, outvaluep, zh->
valuesz);
353 entry_idx = (entry_idx + 1) & (zh->
nentries - 1);
387 void *p = *(
void**) key;
418 void *p = *(
void**) value;
462 uint32_t a = *((uint32_t*) _a);
471 uint32_t a = *((uint32_t*) _a);
472 uint32_t b = *((uint32_t*) _b);
481 uint64_t a = *((uint64_t*) _a);
482 return (uint32_t) (a ^ (a >> 32));
490 uint64_t a = *((uint64_t*) _a);
491 uint64_t b = *((uint64_t*) _b);
511 uint32_t
hash = ip.
i;
523 const void * ptra = * (
void**)a;
524 const void * ptrb = * (
void**)b;
534 char *a = * (
char**)_a;
535 char *b = * (
char**)_b;
537 return !strcmp(a, b);
544 char *a = * (
char**)_a;
548 hash = (hash << 7) + (hash >> 23);
553 return (uint32_t)
hash;
559 for (
int entry_idx = 0; entry_idx < zh->
nentries; entry_idx++) {
561 memcpy(&k, &zh->
entries[entry_idx * zh->
entrysz + 1],
sizeof(
char*));
563 printf(
"%d: %d, %s => %s\n", entry_idx, zh->
entries[entry_idx * zh->
entrysz], k, v);
int(* equals)(const void *a, const void *b)
void zhash_map_keys(zhash_t *zh, void(*f)())
uint32_t zhash_uint32_hash(const void *_a)
int zhash_get(const zhash_t *zh, const void *key, void *out_value)
#define ZHASH_FACTOR_REALLOC
uint32_t zhash_str_hash(const void *_a)
uint32_t zhash_uint64_hash(const void *_a)
int zhash_iterator_next(zhash_iterator_t *zit, void *outkey, void *outvalue)
int zhash_put(zhash_t *zh, const void *key, const void *value, void *oldkey, void *oldvalue)
int zhash_iterator_next_volatile(zhash_iterator_t *zit, void *outkey, void *outvalue)
uint32_t(* hash)(const void *a)
void zhash_map_values(zhash_t *zh, void(*f)())
void zhash_vmap_values(zhash_t *zh, void(*f)())
zhash_t * zhash_create_capacity(size_t keysz, size_t valuesz, uint32_t(*hash)(const void *a), int(*equals)(const void *a, const void *b), int capacity)
int zhash_uint32_equals(const void *_a, const void *_b)
static zarray_t * zarray_create(size_t el_sz)
int zhash_uint64_equals(const void *_a, const void *_b)
#define ZHASH_FACTOR_CRITICAL
void zhash_clear(zhash_t *zh)
void zhash_iterator_init(zhash_t *zh, zhash_iterator_t *zit)
void zhash_iterator_init_const(const zhash_t *zh, zhash_iterator_t *zit)
zhash_t * zhash_copy(const zhash_t *zh)
int zhash_size(const zhash_t *zh)
void zhash_vmap_keys(zhash_t *zh, void(*f)())
int zhash_contains(const zhash_t *zh, const void *key)
void zhash_destroy(zhash_t *zh)
zarray_t * zhash_keys(const zhash_t *zh)
int zhash_remove(zhash_t *zh, const void *key, void *old_key, void *old_value)
zhash_t * zhash_create(size_t keysz, size_t valuesz, uint32_t(*hash)(const void *a), int(*equals)(const void *a, const void *b))
int zhash_ptr_equals(const void *a, const void *b)
void zhash_debug(zhash_t *zh)
zarray_t * zhash_values(const zhash_t *zh)
int zhash_get_volatile(const zhash_t *zh, const void *key, void *out_value)
void zhash_iterator_remove(zhash_iterator_t *zit)
int zhash_str_equals(const void *_a, const void *_b)
static void zarray_add(zarray_t *za, const void *p)
uint32_t zhash_ptr_hash(const void *a)