On Mon, Oct 15, 2018 at 4:21 AM brian m. carlson <sandals@xxxxxxxxxxxxxxxxxxxx> wrote: > diff --git a/cache.h b/cache.h > index a13d14ce0a..0b88c3a344 100644 > --- a/cache.h > +++ b/cache.h > @@ -1024,16 +1024,12 @@ extern const struct object_id null_oid; > static inline int hashcmp(const unsigned char *sha1, const unsigned char *sha2) > { > /* > - * This is a temporary optimization hack. By asserting the size here, > - * we let the compiler know that it's always going to be 20, which lets > - * it turn this fixed-size memcmp into a few inline instructions. > - * > - * This will need to be extended or ripped out when we learn about > - * hashes of different sizes. > + * Teach the compiler that there are only two possibilities of hash size > + * here, so that it can optimize for this case as much as possible. > */ > - if (the_hash_algo->rawsz != 20) > - BUG("hash size not yet supported by hashcmp"); > - return memcmp(sha1, sha2, the_hash_algo->rawsz); > + if (the_hash_algo->rawsz == GIT_MAX_RAWSZ) It's tangent. But performance is probably another good reason to detach the_hash_algo from the_repository so we have one less dereference to do. (the other good reason is these hash operations should work in "no-repo" commands as well, where the_repository does not really make sense). > + return memcmp(sha1, sha2, GIT_MAX_RAWSZ); > + return memcmp(sha1, sha2, GIT_SHA1_RAWSZ); > } > > static inline int oidcmp(const struct object_id *oid1, const struct object_id *oid2) > @@ -1043,7 +1039,13 @@ static inline int oidcmp(const struct object_id *oid1, const struct object_id *o > > static inline int hasheq(const unsigned char *sha1, const unsigned char *sha2) > { > - return !hashcmp(sha1, sha2); > + /* > + * We write this here instead of deferring to hashcmp so that the > + * compiler can properly inline it and avoid calling memcmp. > + */ > + if (the_hash_algo->rawsz == GIT_MAX_RAWSZ) > + return !memcmp(sha1, sha2, GIT_MAX_RAWSZ); > + return !memcmp(sha1, sha2, GIT_SHA1_RAWSZ); > } > > static inline int oideq(const struct object_id *oid1, const struct object_id *oid2) -- Duy