const unsigned char *sha1,
                                         int *found)
 {
-       uint32_t i, hash, mask = (pdata->index_size - 1);
+       uint32_t i, mask = (pdata->index_size - 1);
 
-       memcpy(&hash, sha1, sizeof(uint32_t));
-       i = hash & mask;
+       i = sha1hash(sha1) & mask;
 
        while (pdata->index[i] > 0) {
                uint32_t pos = pdata->index[i] - 1;
        if (pdata->index_size < 1024)
                pdata->index_size = 1024;
 
-       pdata->index = xrealloc(pdata->index, sizeof(uint32_t) * pdata->index_size);
-       memset(pdata->index, 0, sizeof(int) * pdata->index_size);
+       free(pdata->index);
+       pdata->index = xcalloc(pdata->index_size, sizeof(*pdata->index));
 
        entry = pdata->objects;
 
 
        if (pdata->nr_objects >= pdata->nr_alloc) {
                pdata->nr_alloc = (pdata->nr_alloc  + 1024) * 3 / 2;
-               pdata->objects = xrealloc(pdata->objects,
-                                         pdata->nr_alloc * sizeof(*new_entry));
+               REALLOC_ARRAY(pdata->objects, pdata->nr_alloc);
        }
 
        new_entry = pdata->objects + pdata->nr_objects++;