1#ifndef HASH_H 2#define HASH_H 3 4/* 5 * These are some simple generic hash table helper functions. 6 * Not necessarily suitable for all users, but good for things 7 * where you want to just keep track of a list of things, and 8 * have a good hash to use on them. 9 * 10 * It keeps the hash table at roughly 50-75% free, so the memory 11 * cost of the hash table itself is roughly 12 * 13 * 3 * 2*sizeof(void *) * nr_of_objects 14 * 15 * bytes. 16 * 17 * FIXME: on 64-bit architectures, we waste memory. It would be 18 * good to have just 32-bit pointers, requiring a special allocator 19 * for hashed entries or something. 20 */ 21struct hash_table_entry { 22unsigned int hash; 23void*ptr; 24}; 25 26struct hash_table { 27unsigned int size, nr; 28struct hash_table_entry *array; 29}; 30 31externvoid*lookup_hash(unsigned int hash,const struct hash_table *table); 32externvoid**insert_hash(unsigned int hash,void*ptr,struct hash_table *table); 33externintfor_each_hash(const struct hash_table *table,int(*fn)(void*,void*),void*data); 34externvoidfree_hash(struct hash_table *table); 35 36staticinlinevoidinit_hash(struct hash_table *table) 37{ 38 table->size =0; 39 table->nr =0; 40 table->array = NULL; 41} 42 43#endif