+@@ -52,9 +53,27 @@ static size_t *tag_table;
+ #define gettag2(s1,s2) (((s1) + (s2)) & 0xFFFF)
+ #define gettag(sum) gettag2((sum)&0xFFFF,(sum)>>16)
+
++static struct sum_buf *current_sums;
++static int current_s2length;
++
+ static int compare_targets(struct target *t1,struct target *t2)
+ {
+- return (int)t1->t - (int)t2->t;
++ struct sum_buf *s1, *s2;
++ int diff;
++
++ if (t1->t != t2->t)
++ return t1->t < t2->t ? -1 : 1;
++
++ s1 = ¤t_sums[t1->i];
++ s2 = ¤t_sums[t2->i];
++
++ if (s1->sum1 != s2->sum1)
++ return s1->sum1 < s2->sum1 ? -1 : 1;
++
++ if ((diff = memcmp(s1->sum2, s2->sum2, current_s2length)) != 0)
++ return diff;
++
++ return s1->offset - s2->offset;
+ }
+
+
+@@ -74,6 +93,8 @@ static void build_hash_table(struct sum_
+ targets[i].t = gettag(s->sums[i].sum1);
+ }
+
++ current_sums = s->sums;
++ current_s2length = s->s2length;
+ qsort(targets,s->count,sizeof(targets[0]),(int (*)())compare_targets);
+
+ for (i = 0; i < TABLESIZE; i++)
+@@ -192,12 +213,24 @@ static void hash_search(int f,struct sum
+ unsigned int l;
+ size_t i = targets[j].i;
+
+- if (sum != s->sums[i].sum1)
++ if (sum != s->sums[i].sum1) {
++ if (done_csum2)
++ break;