Fix hash function in xdiff library v1.4.2.4
authorLinus Torvalds <torvalds@osdl.org>
Tue, 17 Oct 2006 02:58:54 +0000 (19:58 -0700)
committerJunio C Hamano <junkio@cox.net>
Tue, 17 Oct 2006 04:27:44 +0000 (21:27 -0700)
Jim Mayering noticed that xdiff library took insanely long time
when comparing files with many identical lines.

This was because the hash function used in the library is broken
on 64-bit architectures and caused too many collisions.

http://thread.gmane.org/gmane.comp.version-control.git/28962/focus=28994

Acked-by: Davide Libenzi <davidel@xmaliserver.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
xdiff/xmacros.h

index 4c2fde80c143b3aaf086dc36c1a050851f83feaa..e2cd2023b31e794bc0c5ba28f64ae4ce4e128184 100644 (file)
 #define XMACROS_H
 
 
-#define GR_PRIME 0x9e370001UL
 
 
 #define XDL_MIN(a, b) ((a) < (b) ? (a): (b))
 #define XDL_MAX(a, b) ((a) > (b) ? (a): (b))
 #define XDL_ABS(v) ((v) >= 0 ? (v): -(v))
 #define XDL_ISDIGIT(c) ((c) >= '0' && (c) <= '9')
-#define XDL_HASHLONG(v, b) (((unsigned long)(v) * GR_PRIME) >> ((CHAR_BIT * sizeof(unsigned long)) - (b)))
+#define XDL_ADDBITS(v,b)       ((v) + ((v) >> (b)))
+#define XDL_MASKBITS(b)                ((1UL << (b)) - 1)
+#define XDL_HASHLONG(v,b)      (XDL_ADDBITS((unsigned long)(v), b) & XDL_MASKBITS(b))
 #define XDL_PTRFREE(p) do { if (p) { xdl_free(p); (p) = NULL; } } while (0)
 #define XDL_LE32_PUT(p, v) \
 do { \