14void CRC32(
void *key,
size_t *keysize, uint32_t *hashval){
15 *hashval = 0xffffffff;
17 for(
size_t i = 0; i < *keysize; i++){
18 uint8_t value = *(((uint8_t *)key) + i);
19 for(uint8_t j = 0; j < 8; j++){
20 uint8_t flag = (uint8_t)((value ^ *hashval) & 1);
22 if(flag){ *hashval ^= 0xEDB888320; }
37 (*node)->keysize = *keysize;
50 external(node, userdata);
58 (*htable)->
size = bucketsize;
60 (*htable)->hash = (hash)? hash :
CRC32;
65 for(uint32_t i = 0; i < htable->
size; i++){
77 htable->
hash(key, &keysize, &size);
82 htable->
nodes[size % htable->
size] = bucket;
97 bucket = bucket->
node;
105 htable->
hash(key, &keysize, &size);
115 *data = bucket->
data;
125 bucket = bucket->
node;
133 htable->
hash(key, &keysize, &size);
146 external(temp, userdata);
159 external(temp, userdata);
166 bucket = bucket->
node;
void ARC_HashtableNode_Create(ARC_HashtableNode **node, void *key, size_t *keysize, void *data)
void ARC_Hashtable_Destroy(ARC_Hashtable *htable, ARC_HashtableNode_DestroyExternal external, void *userdata)
destroys ARC_Hashtable type
void ARC_HashtableNode_Destroy(ARC_HashtableNode *node, ARC_HashtableNode_DestroyExternal external, void *userdata)
void ARC_Hashtable_Get(ARC_Hashtable *htable, void *key, size_t keysize, void **data)
gets value from hashtable by key
void ARC_Hashtable_Create(ARC_Hashtable **htable, uint32_t bucketsize, ARC_Hashtable_Hash hash, ARC_Hashtable_KeyCompare compare)
cteates ARC_Hashtable type
void ARC_Hashtable_Remove(ARC_Hashtable *htable, void *key, size_t keysize, ARC_HashtableNode_DestroyExternal external, void *userdata)
removes value from hashtable
void ARC_Hashtable_Add(ARC_Hashtable *htable, void *key, size_t keysize, void *data)
adds value to hastable
int8_t ARC_Default_Key_Compare(void *key1, size_t *key1size, void *key2, size_t *key2size)
void CRC32(void *key, size_t *keysize, uint32_t *hashval)
int8_t(* ARC_Hashtable_KeyCompare)(void *key1, size_t *key1size, void *key2, size_t *key2size)
key comparison function ptr
void(* ARC_HashtableNode_DestroyExternal)(ARC_HashtableNode *node, void *userdata)
callback to allow memory freeing of nodes
void(* ARC_Hashtable_Hash)(void *key, size_t *keysize, uint32_t *hashval)
a hashing function ptr
ARC_HashtableNode ** nodes
ARC_Hashtable_KeyCompare compare