From d4f3ae0c43c5602b0ca17f4274ee4ffb928f8f7f Mon Sep 17 00:00:00 2001 From: David Turner Date: Fri, 27 Apr 2018 15:04:18 -0400 Subject: [PATCH] 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 --- .../src/org/eclipse/jgit/lib/AnyObjectId.java | 18 ++++++++++-------- 1 file 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 58477657f..91c9a6b04 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 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;