aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Turner <dturner@twosigma.com>2018-04-27 15:04:18 -0400
committerDavid Turner <dturner@twosigma.com>2018-04-27 15:21:30 -0400
commitd4f3ae0c43c5602b0ca17f4274ee4ffb928f8f7f (patch)
tree33de7cccf726f114be02858cc2f3b626e0773e30
parent4dcf2f93db3f31262220140484237cfbb4189f4d (diff)
downloadjgit-d4f3ae0c43c5602b0ca17f4274ee4ffb928f8f7f.tar.gz
jgit-d4f3ae0c43c5602b0ca17f4274ee4ffb928f8f7f.zip
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>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java18
1 files changed, 10 insertions, 8 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
index 58477657f6..91c9a6b04e 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/AnyObjectId.java
@@ -73,17 +73,19 @@ public abstract class AnyObjectId implements Comparable<AnyObjectId> {
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;