Fix comparison order in AnyObjectId

The previous version suggested testing w2 first because w1 was used
for hashing, but in fact, hashCode returns w2.  The order (w3, w4, w5,
w1, w2) might be better on 64-bit processors too, since it allows
comparing 64 bits at a time, although perhaps on a modern SIMD
processor, the entire 160 bytes would be compared at once anyway.

Change-Id: Ieb69606d3c1456aeff36bffe99a71587ea76e977
Signed-off-by: David Turner <dturner@twosigma.com>
This commit is contained in:
David Turner 2018-04-27 15:04:18 -04:00
parent 4dcf2f93db
commit d4f3ae0c43
1 changed files with 10 additions and 8 deletions

View File

@ -73,17 +73,19 @@ public static boolean equals(final AnyObjectId firstObjectId,
if (firstObjectId == secondObjectId)
return true;
// We test word 2 first as odds are someone already used our
// word 1 as a hash code, and applying that came up with these
// two instances we are comparing for equality. Therefore the
// first two words are very likely to be identical. We want to
// break away from collisions as quickly as possible.
// We test word 3 first since the git file-based ODB
// uses the first byte of w1, and we use w2 as the
// hash code, one of those probably came up with these
// two instances which we are comparing for equality.
// Therefore the first two words are very likely to be
// identical. We want to break away from collisions as
// quickly as possible.
//
return firstObjectId.w2 == secondObjectId.w2
&& firstObjectId.w3 == secondObjectId.w3
return firstObjectId.w3 == secondObjectId.w3
&& firstObjectId.w4 == secondObjectId.w4
&& firstObjectId.w5 == secondObjectId.w5
&& firstObjectId.w1 == secondObjectId.w1;
&& firstObjectId.w1 == secondObjectId.w1
&& firstObjectId.w2 == secondObjectId.w2;
}
int w1;