diff options
author | Linus Torvalds <torvalds@osdl.org> | 2006-03-15 00:37:57 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-03-15 13:19:27 -0800 |
commit | e31c9f241ae5469c820cde2a54987a1075e52a43 (patch) | |
tree | 87e7bdb8180cf7f8564c4d86911c2cf2fa894165 /diffcore-delta.c | |
parent | 3c7ceba4f1e8be1a536dd0e21bc4f422873d08d2 (diff) | |
download | git-e31c9f241ae5469c820cde2a54987a1075e52a43.tar.gz |
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 <junkio@cox.net>
Diffstat (limited to 'diffcore-delta.c')
-rw-r--r-- | diffcore-delta.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/diffcore-delta.c b/diffcore-delta.c index ceb35c3276..7338a40c59 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; |