diff-delta: bound hash list length to avoid O(m*n) behavior
authorNicolas Pitre <nico@cam.org>
Tue, 28 Feb 2006 04:09:55 +0000 (23:09 -0500)
committerJunio C Hamano <junkio@cox.net>
Thu, 2 Mar 2006 05:51:14 +0000 (21:51 -0800)
commit5bb86b82ba18dd2eb736c4f5565f9c920f815b8f
treeeb12f736076fdf124a328d31e9bc0e4ce6c0687c
parentcc5c59a30ccba8b9eac503271661af9b95edb0af
diff-delta: bound hash list length to avoid O(m*n) behavior

The diff-delta code can exhibit O(m*n) behavior with some patological
data set where most hash entries end up in the same hash bucket.

The latest code rework reduced the block size making it particularly
vulnerable to this issue, but the issue was always there and can be
triggered regardless of the block size.

This patch does two things:

1) the hashing has been reworked to offer a better distribution to
   atenuate the problem a bit, and

2) a limit is imposed to the number of entries that can exist in the
   same hash bucket.

Because of the above the code is a bit more expensive on average, but
the problematic samples used to diagnoze the issue are now orders of
magnitude less expensive to process with only a slight loss in
compression.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
diff-delta.c