Go to the documentation of this file.
35 HashTable*
HashTableInit(uint32_t size, uint32_t (*Hash)(
struct HashTable_ *,
void *, uint16_t),
char (*Compare)(
void *, uint16_t,
void *, uint16_t),
void (*Free)(
void *)) {
63 if (ht->
array == NULL)
70 if (ht->
array != NULL)
88 while (hashbucket != NULL) {
93 hashbucket = next_hashbucket;
98 if (ht->
array != NULL)
106 printf(
"\n----------- Hash Table Stats ------------\n");
107 printf(
"Buckets: %" PRIu32
"\n", ht->
array_size);
108 printf(
"Hash function pointer: %p\n", ht->
Hash);
109 printf(
"-----------------------------------------\n");
114 if (ht == NULL || data == NULL)
117 uint32_t hash = ht->
Hash(ht, data, datalen);
127 SCLogWarning(
"attempt to insert element out of hash array\n");
131 if (ht->
array[hash] == NULL) {
132 ht->
array[hash] = hb;
135 ht->
array[hash] = hb;
152 uint32_t hash = ht->
Hash(ht, data, datalen);
154 if (ht->
array[hash] == NULL) {
159 if (ht->
Free != NULL)
162 ht->
array[hash] = NULL;
168 if (ht->
Compare(hashbucket->
data,hashbucket->
size,data,datalen) == 1) {
169 if (prev_hashbucket == NULL) {
174 prev_hashbucket->
next = hashbucket->
next;
178 if (ht->
Free != NULL)
184 prev_hashbucket = hashbucket;
185 hashbucket = hashbucket->
next;
186 }
while (hashbucket != NULL);
198 hash = ht->
Hash(ht, data, datalen);
201 SCLogWarning(
"attempt to access element out of hash array\n");
205 if (ht->
array[hash] == NULL)
210 if (ht->
Compare(hashbucket->
data, hashbucket->
size, data, datalen) == 1)
211 return hashbucket->
data;
213 hashbucket = hashbucket->
next;
214 }
while (hashbucket != NULL);
221 uint8_t *d = (uint8_t *)data;
225 for (i = 0; i < datalen; i++) {
226 if (i == 0) hash += (((uint32_t)*d++));
227 else if (i == 1) hash += (((uint32_t)*d++) * datalen);
228 else hash *= (((uint32_t)*d++) * i) + datalen + i;
241 if (
SCMemcmp(data1,data2,len1) != 0)
252 static int HashTableTestInit01 (
void)
263 static int HashTableTestInit02 (
void)
273 static int HashTableTestInit03 (
void)
287 static int HashTableTestInit04 (
void)
297 static int HashTableTestInit05 (
void)
311 static char HashTableDefaultCompareTest(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
316 if (
SCMemcmp(data1,data2,len1) != 0)
322 static int HashTableTestInit06 (
void)
329 if (ht->
Compare == HashTableDefaultCompareTest)
336 static int HashTableTestAdd01 (
void)
354 static int HashTableTestAdd02 (
void)
372 static int HashTableTestFull01 (
void)
398 static int HashTableTestFull02 (
void)
char HashTableDefaultCompare(void *data1, uint16_t len1, void *data2, uint16_t len2)
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
void HashTableFree(HashTable *ht)
char(* Compare)(void *, uint16_t, void *, uint16_t)
void HashTableRegisterTests(void)
void * HashTableLookup(HashTable *ht, void *data, uint16_t datalen)
int HashTableRemove(HashTable *ht, void *data, uint16_t datalen)
#define SCLogWarning(...)
Macro used to log WARNING messages.
int HashTableAdd(HashTable *ht, void *data, uint16_t datalen)
struct HashTableBucket_ * next
void HashTablePrint(HashTable *ht)
HashTable * HashTableInit(uint32_t size, uint32_t(*Hash)(struct HashTable_ *, void *, uint16_t), char(*Compare)(void *, uint16_t, void *, uint16_t), void(*Free)(void *))
uint32_t HashTableGenericHash(HashTable *ht, void *data, uint16_t datalen)
#define SCMemcmp(a, b, c)
uint32_t(* Hash)(struct HashTable_ *, void *, uint16_t)