@@ -43,16 +43,17 @@ int type_from_string(const char *str)
43
43
die ("invalid object type \"%s\"" , str );
44
44
}
45
45
46
- static unsigned int hash_obj (struct object * obj , unsigned int n )
46
+ static unsigned int hash_obj (const unsigned char * sha1 , unsigned int n )
47
47
{
48
48
unsigned int hash ;
49
- memcpy (& hash , obj -> sha1 , sizeof (unsigned int ));
50
- return hash % n ;
49
+ memcpy (& hash , sha1 , sizeof (unsigned int ));
50
+ /* Assumes power-of-2 hash sizes in grow_object_hash */
51
+ return hash & (n - 1 );
51
52
}
52
53
53
54
static void insert_obj_hash (struct object * obj , struct object * * hash , unsigned int size )
54
55
{
55
- unsigned int j = hash_obj (obj , size );
56
+ unsigned int j = hash_obj (obj -> sha1 , size );
56
57
57
58
while (hash [j ]) {
58
59
j ++ ;
@@ -62,13 +63,6 @@ static void insert_obj_hash(struct object *obj, struct object **hash, unsigned i
62
63
hash [j ] = obj ;
63
64
}
64
65
65
- static unsigned int hashtable_index (const unsigned char * sha1 )
66
- {
67
- unsigned int i ;
68
- memcpy (& i , sha1 , sizeof (unsigned int ));
69
- return i % obj_hash_size ;
70
- }
71
-
72
66
struct object * lookup_object (const unsigned char * sha1 )
73
67
{
74
68
unsigned int i , first ;
@@ -77,7 +71,7 @@ struct object *lookup_object(const unsigned char *sha1)
77
71
if (!obj_hash )
78
72
return NULL ;
79
73
80
- first = i = hashtable_index (sha1 );
74
+ first = i = hash_obj (sha1 , obj_hash_size );
81
75
while ((obj = obj_hash [i ]) != NULL ) {
82
76
if (!hashcmp (sha1 , obj -> sha1 ))
83
77
break ;
@@ -101,6 +95,10 @@ struct object *lookup_object(const unsigned char *sha1)
101
95
static void grow_object_hash (void )
102
96
{
103
97
int i ;
98
+ /*
99
+ * Note that this size must always be power-of-2 to match hash_obj
100
+ * above.
101
+ */
104
102
int new_hash_size = obj_hash_size < 32 ? 32 : 2 * obj_hash_size ;
105
103
struct object * * new_hash ;
106
104
0 commit comments