Go to the documentation of this file.
34 HashTable*
HashTableInit(uint32_t size, uint32_t (*Hash)(
struct HashTable_ *,
void *, uint16_t),
char (*Compare)(
void *, uint16_t,
void *, uint16_t),
void (*Free)(
void *)) {
62 if (ht->
array == NULL)
69 if (ht->
array != NULL)
78 uint32_t (*Hash)(
struct HashTable_ *,
void *, uint16_t),
79 char (*Compare)(
void *, uint16_t,
void *, uint16_t),
void (*Free)(
void *),
101 return next_hashbucket;
117 for (uint32_t i = 0; i < ht->
array_size; i++) {
119 while (hashbucket != NULL) {
120 hashbucket = HashTableBucketFree(ht, hashbucket);
125 if (ht->
array != NULL)
133 if (ht == NULL || data == NULL)
136 uint32_t hash = ht->
Hash(ht, data, datalen);
146 SCLogWarning(
"attempt to insert element out of hash array\n");
150 if (ht->
array[hash] == NULL) {
151 ht->
array[hash] = hb;
154 ht->
array[hash] = hb;
179 uint32_t hash = ht->
Hash(ht, data, datalen);
182 while (*hashbucket != NULL) {
183 if (ht->
Compare((*hashbucket)->data, (*hashbucket)->size, data, datalen)) {
184 *hashbucket = HashTableBucketFree(ht, *hashbucket);
187 hashbucket = &((*hashbucket)->next);
200 hash = ht->
Hash(ht, data, datalen);
203 SCLogWarning(
"attempt to access element out of hash array\n");
207 if (ht->
array[hash] == NULL)
212 if (ht->
Compare(hashbucket->
data, hashbucket->
size, data, datalen) == 1)
213 return hashbucket->
data;
215 hashbucket = hashbucket->
next;
216 }
while (hashbucket != NULL);
224 if (ht == NULL || CallbackFn == NULL)
227 for (uint32_t i = 0; i < ht->
array_size; i++) {
229 while (hashbucket != NULL) {
230 CallbackFn(hashbucket->
data, aux);
231 hashbucket = hashbucket->
next;
238 uint8_t *d = (uint8_t *)data;
242 for (i = 0; i < datalen; i++) {
243 if (i == 0) hash += (((uint32_t)*d++));
244 else if (i == 1) hash += (((uint32_t)*d++) * datalen);
245 else hash *= (((uint32_t)*d++) * i) + datalen + i;
258 if (
SCMemcmp(data1,data2,len1) != 0)
269 static int HashTableTestInit01 (
void)
280 static int HashTableTestInit02 (
void)
290 static int HashTableTestInit03 (
void)
304 static int HashTableTestInit04 (
void)
314 static int HashTableTestInit05 (
void)
328 static char HashTableDefaultCompareTest(
void *data1, uint16_t len1,
void *data2, uint16_t len2)
333 if (
SCMemcmp(data1,data2,len1) != 0)
339 static int HashTableTestInit06 (
void)
346 if (ht->
Compare == HashTableDefaultCompareTest)
353 static int HashTableTestAdd01 (
void)
371 static int HashTableTestAdd02 (
void)
389 static int HashTableTestFull01 (
void)
415 static int HashTableTestFull02 (
void)
441 static int HashTableTestCollisionBug(
void)
490 UtRegisterTest(
"HashTableTestCollisionBug", HashTableTestCollisionBug);
#define FAIL_IF_NULL(expr)
Fail a test if expression evaluates to NULL.
char HashTableDefaultCompare(void *data1, uint16_t len1, void *data2, uint16_t len2)
void UtRegisterTest(const char *name, int(*TestFn)(void))
Register unit test.
void HashTableIterate(HashTable *ht, void(*CallbackFn)(void *, void *), void *aux)
#define FAIL_IF_NOT(expr)
Fail a test if expression evaluates to false.
void HashTableFree(HashTable *ht)
Free a HashTable and all its contents.
#define FAIL_IF_NOT_NULL(expr)
Fail a test if expression evaluates to non-NULL.
#define PASS
Pass the test.
HashTable * HashTableInitWithSeed(uint32_t size, uint32_t(*Hash)(struct HashTable_ *, void *, uint16_t), char(*Compare)(void *, uint16_t, void *, uint16_t), void(*Free)(void *), const uint32_t seed)
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)
Remove an item from the hash table.
#define SCLogWarning(...)
Macro used to log WARNING messages.
int HashTableAdd(HashTable *ht, void *data, uint16_t datalen)
struct HashTableBucket_ * next
#define FAIL_IF(expr)
Fail a test if expression evaluates to true.
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)