We already have 10 hash bits encoded in the offset itself; we only get
here incorrectly about 1 time in 1000, so it's a pretty minor
optimization at best.
Nonetheless, we have the information, so let's check it before
accessing the key. This reduces the probability of a false keycmp by
another factor of 2000.
if (tdb_read_convert(tdb, off, rec, sizeof(*rec)) == -1)
return ret;
- /* FIXME: check extra bits in header? */
if (rec_key_length(rec) != key->dsize) {
add_stat(tdb, compare_wrong_keylen, 1);
return ret;
}
+ if ((h->h & ((1 << 11)-1)) != rec_hash(rec)) {
+ add_stat(tdb, compare_wrong_rechash, 1);
+ return false;
+ }
+
rkey = tdb_access_read(tdb, off + sizeof(*rec), key->dsize, false);
if (!rkey)
return ret;