diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-09-20 12:30:49 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-09-20 12:30:49 -0700 |
commit | 3fb9d685dbff20bbc9d441a85eb3bef17ef5ec0f (patch) | |
tree | 17a7f8bced51114212a0fc6403487400e4432090 | |
parent | Merge branch 'hu/cherry-pick-previous-branch' (diff) | |
parent | lookup_object: remove hashtable_index() and optimize hash_obj() (diff) | |
download | tgif-3fb9d685dbff20bbc9d441a85eb3bef17ef5ec0f.tar.xz |
Merge branch 'np/lookup-object-hashing'
Micro optimize hash function used in the object hash table.
* np/lookup-object-hashing:
lookup_object: remove hashtable_index() and optimize hash_obj()
-rw-r--r-- | object.c | 22 |
1 files changed, 10 insertions, 12 deletions
@@ -43,16 +43,17 @@ int type_from_string(const char *str) die("invalid object type \"%s\"", str); } -static unsigned int hash_obj(struct object *obj, unsigned int n) +static unsigned int hash_obj(const unsigned char *sha1, unsigned int n) { unsigned int hash; - memcpy(&hash, obj->sha1, sizeof(unsigned int)); - return hash % n; + memcpy(&hash, sha1, sizeof(unsigned int)); + /* Assumes power-of-2 hash sizes in grow_object_hash */ + return hash & (n - 1); } static void insert_obj_hash(struct object *obj, struct object **hash, unsigned int size) { - unsigned int j = hash_obj(obj, size); + unsigned int j = hash_obj(obj->sha1, size); while (hash[j]) { j++; @@ -62,13 +63,6 @@ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned i hash[j] = obj; } -static unsigned int hashtable_index(const unsigned char *sha1) -{ - unsigned int i; - memcpy(&i, sha1, sizeof(unsigned int)); - return i % obj_hash_size; -} - struct object *lookup_object(const unsigned char *sha1) { unsigned int i, first; @@ -77,7 +71,7 @@ struct object *lookup_object(const unsigned char *sha1) if (!obj_hash) return NULL; - first = i = hashtable_index(sha1); + first = i = hash_obj(sha1, obj_hash_size); while ((obj = obj_hash[i]) != NULL) { if (!hashcmp(sha1, obj->sha1)) break; @@ -101,6 +95,10 @@ struct object *lookup_object(const unsigned char *sha1) static void grow_object_hash(void) { int i; + /* + * Note that this size must always be power-of-2 to match hash_obj + * above. + */ int new_hash_size = obj_hash_size < 32 ? 32 : 2 * obj_hash_size; struct object **new_hash; |