threads / patch / 5949

patchreduce delta head inflated size

Subject: [PATCH] reduce delta head inflated size

## tl;dr

3 messages between Oct 18, 2006 and Oct 19, 2006. Diffs are folded; open one to read it.

replies: 2people: 2as markdown or json

Nicolas Pitre· Oct 18, 2006, 19:56 UTC · lore

Supposing that both the base and result sizes were both full size 64-bit values, their encoding would occupy only 9.2 bytes each. Therefore inflating 64 bytes is way overkill. Limit it to 20 bytes instead which should be plenty enough for a couple years to come.

Signed-off-by: Nicolas Pitre <nico@cam.org>
---
Show changes to sha1_file.c +1 −1
diff --git a/sha1_file.c b/sha1_file.c
index 25c0bf9..e89d24c 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -943,7 +943,7 @@ static int packed_delta_info(struct pack
 
 	if (sizep) {
 		const unsigned char *data;
-		unsigned char delta_head[64];
+		unsigned char delta_head[20];
 		unsigned long result_size;
 		z_stream stream;
 		int st;
Morten Welinder· Oct 19, 2006, 13:49 UTC · re: Nicolas Pitre · lore

Re: [PATCH] reduce delta head inflated size

On 10/18/06, Nicolas Pitre <nico@cam.org> wrote:
> Supposing that both the base and result sizes were both full size 64-bit
> values, their encoding would occupy only 9.2 bytes each.  Therefore
> inflating 64 bytes is way overkill.  Limit it to 20 bytes instead which
> should be plenty enough for a couple years to come.
2^63 ~ 9.2e18

Thus one signed 64-bit number can take up 1 sign + 19 digits + 1 nul. That's 21 bytes.

If you don't like the constant, 4*sizeof(integer type) should work. (Assuming sizeof measures in bytes.)

M.
Nicolas Pitre· Oct 19, 2006, 14:17 UTC · re: Morten Welinder · lore

Re: [PATCH] reduce delta head inflated size

On Thu, 19 Oct 2006, Morten Welinder wrote:
Show 10 quoted lines
> On 10/18/06, Nicolas Pitre <nico@cam.org> wrote:
> > Supposing that both the base and result sizes were both full size 64-bit
> > values, their encoding would occupy only 9.2 bytes each.  Therefore
> > inflating 64 bytes is way overkill.  Limit it to 20 bytes instead which
> > should be plenty enough for a couple years to come.
> 
> 2^63 ~ 9.2e18
> 
> Thus one signed 64-bit number can take up 1 sign + 19 digits + 1 nul.
> That's 21 bytes.

No. In this case the value is kept binary, with bits spread over consecutive bytes but with the MSB indicating continuation on the next byte.

This means 64 bits / 7 bits per byte = 9.1 bytes, hence 10. Then there are 2 of those values that makes 20 bytes.

Nicolas

← back to recent threads