mirror of
https://github.com/git/git.git
synced 2024-11-25 02:44:48 +08:00
c73592812d
This avoids unnecessary re-allocations and reinsertions. On webkit.git (i.e. about 182k inserts to the name hash table), this reduces about 100ms out of 3s user time. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
51 lines
1.4 KiB
C
51 lines
1.4 KiB
C
#ifndef HASH_H
|
|
#define HASH_H
|
|
|
|
/*
|
|
* These are some simple generic hash table helper functions.
|
|
* Not necessarily suitable for all users, but good for things
|
|
* where you want to just keep track of a list of things, and
|
|
* have a good hash to use on them.
|
|
*
|
|
* It keeps the hash table at roughly 50-75% free, so the memory
|
|
* cost of the hash table itself is roughly
|
|
*
|
|
* 3 * 2*sizeof(void *) * nr_of_objects
|
|
*
|
|
* bytes.
|
|
*
|
|
* FIXME: on 64-bit architectures, we waste memory. It would be
|
|
* good to have just 32-bit pointers, requiring a special allocator
|
|
* for hashed entries or something.
|
|
*/
|
|
struct hash_table_entry {
|
|
unsigned int hash;
|
|
void *ptr;
|
|
};
|
|
|
|
struct hash_table {
|
|
unsigned int size, nr;
|
|
struct hash_table_entry *array;
|
|
};
|
|
|
|
extern void *lookup_hash(unsigned int hash, const struct hash_table *table);
|
|
extern void **insert_hash(unsigned int hash, void *ptr, struct hash_table *table);
|
|
extern int for_each_hash(const struct hash_table *table, int (*fn)(void *, void *), void *data);
|
|
extern void free_hash(struct hash_table *table);
|
|
|
|
static inline void init_hash(struct hash_table *table)
|
|
{
|
|
table->size = 0;
|
|
table->nr = 0;
|
|
table->array = NULL;
|
|
}
|
|
|
|
static inline void preallocate_hash(struct hash_table *table, unsigned int elts)
|
|
{
|
|
assert(table->size == 0 && table->nr == 0 && table->array == NULL);
|
|
table->size = elts * 2;
|
|
table->array = xcalloc(sizeof(struct hash_table_entry), table->size);
|
|
}
|
|
|
|
#endif
|