In schema_init.c hashPreset() we compute the initial value of the index hash. This includes a prefix string which is usually the attribute's canonical name, a prefix character which is 0 or a particular substring index type, and then the syntax OID and matching rule OID.
This is computed once per attribute. We could instead compute this one-time only, and save the result in the Attribute structure, or the AttributeDescription structure. (It probably makes most sense in the latter, since the prefix also may include any tags on the attributeDescription.)
This change would require changing the signature of the indexer functions, to pass in the AttrDesc pointer or something to convey the precomputed hash.
Or we could do away with some of this. Hashing against the syntax and mr OID seems gratuitous, since the index values are already going to be segregated by prefix and pre. One way or another, the hash over these two OIDs should be factored out, because even if we want to keep them, they're constants and we shouldn't need to keep recomputing them.