From: Linus Torvalds Date: Wed, 15 Mar 2006 08:37:57 +0000 (-0800) Subject: diffcore-delta: 64-byte-or-EOL ultrafast replacement (hash fix). X-Git-Tag: v1.3.0-rc1~27^2 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=e31c9f241ae5469c820cde2a54987a1075e52a43;p=git.git diffcore-delta: 64-byte-or-EOL ultrafast replacement (hash fix). The rotating 64-bit number was not really rotating, and worse yet ulong was longer than 64-bit on 64-bit architectures X-<. Signed-off-by: Junio C Hamano --- diff --git a/diffcore-delta.c b/diffcore-delta.c index ceb35c327..7338a40c5 100644 --- a/diffcore-delta.c +++ b/diffcore-delta.c @@ -40,8 +40,8 @@ #define HASHBASE 107927 struct spanhash { - unsigned long hashval; - unsigned long cnt; + unsigned int hashval; + unsigned int cnt; }; struct spanhash_top { int alloc_log2; @@ -50,7 +50,7 @@ struct spanhash_top { }; static struct spanhash *spanhash_find(struct spanhash_top *top, - unsigned long hashval) + unsigned int hashval) { int sz = 1 << top->alloc_log2; int bucket = hashval & (sz - 1); @@ -99,7 +99,7 @@ static struct spanhash_top *spanhash_rehash(struct spanhash_top *orig) } static struct spanhash_top *add_spanhash(struct spanhash_top *top, - unsigned long hashval, int cnt) + unsigned int hashval, int cnt) { int bucket, lim; struct spanhash *h; @@ -125,10 +125,10 @@ static struct spanhash_top *add_spanhash(struct spanhash_top *top, } } -static struct spanhash_top *hash_chars(unsigned char *buf, unsigned long sz) +static struct spanhash_top *hash_chars(unsigned char *buf, unsigned int sz) { int i, n; - unsigned long accum1, accum2, hashval; + unsigned int accum1, accum2, hashval; struct spanhash_top *hash; i = INITIAL_HASH_SIZE; @@ -140,10 +140,11 @@ static struct spanhash_top *hash_chars(unsigned char *buf, unsigned long sz) n = 0; accum1 = accum2 = 0; while (sz) { - unsigned long c = *buf++; + unsigned int c = *buf++; + unsigned int old_1 = accum1; sz--; - accum1 = (accum1 << 7) | (accum2 >> 25); - accum2 = (accum2 << 7) | (accum1 >> 25); + accum1 = (accum1 << 7) ^ (accum2 >> 25); + accum2 = (accum2 << 7) ^ (old_1 >> 25); accum1 += c; if (++n < 64 && c != '\n') continue;