aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--delta_write_deltify.go41
-rw-r--r--delta_write_encode.go2
-rw-r--r--delta_write_select.go2
-rw-r--r--packed_write_pack.go6
4 files changed, 23 insertions, 28 deletions
diff --git a/delta_write_deltify.go b/delta_write_deltify.go
index 4aac3fb8..cd3d6aa8 100644
--- a/delta_write_deltify.go
+++ b/delta_write_deltify.go
@@ -3,7 +3,7 @@ package furgit
import (
"bytes"
- "github.com/cespare/xxhash/v2"
+ "codeberg.org/lindenii/furgit/internal/murmurhash2"
)
const (
@@ -62,7 +62,7 @@ var deltaGearTab = [...]uint32{
type deltaBlock struct {
length int
offset int
- hash uint64
+ hash uint32
}
type deltaTable struct {
@@ -82,7 +82,7 @@ type deltaInstruction struct {
data []byte
}
-func deltify(base, target []byte, seed uint64) ([]deltaInstruction, error) {
+func deltify(base, target []byte, seed uint32) ([]deltaInstruction, error) {
if base == nil {
base = []byte{}
}
@@ -96,7 +96,7 @@ func deltify(base, target []byte, seed uint64) ([]deltaInstruction, error) {
return deltifyMemMem(target, 0, len(target), seed, dt, base, 0, len(base))
}
-func deltifyMemMem(target []byte, fileoffset, filesize int, seed uint64, dt *deltaTable, base []byte, baseOffset0, baseSize int) ([]deltaInstruction, error) {
+func deltifyMemMem(target []byte, fileoffset, filesize int, seed uint32, dt *deltaTable, base []byte, baseOffset0, baseSize int) ([]deltaInstruction, error) {
const allocChunkSize = 64
instr := make([]deltaInstruction, 0, allocChunkSize)
offset0 := fileoffset
@@ -141,7 +141,7 @@ func deltifyMemMem(target []byte, fileoffset, filesize int, seed uint64, dt *del
return instr, nil
}
-func deltaTableInitMem(data []byte, fileoffset, filesize int, seed uint64) (*deltaTable, error) {
+func deltaTableInitMem(data []byte, fileoffset, filesize int, seed uint32) (*deltaTable, error) {
dt := &deltaTable{
nalloc: 128,
size: 128,
@@ -164,13 +164,8 @@ func deltaTableInitMem(data []byte, fileoffset, filesize int, seed uint64) (*del
return dt, nil
}
-func deltaHashBlock(p []byte, seed uint64) uint64 {
- if seed == 0 {
- return xxhash.Sum64(p)
- }
- d := xxhash.NewWithSeed(seed)
- _, _ = d.Write(p)
- return d.Sum64()
+func deltaHashBlock(p []byte, seed uint32) uint32 {
+ return murmurhash2.Sum32(p, seed)
}
func deltaNextBlockLen(data []byte, fileoffset, filesize int) int {
@@ -193,7 +188,7 @@ func deltaNextBlockLen(data []byte, fileoffset, filesize int) int {
return p - fileoffset
}
-func (dt *deltaTable) addBlock(data []byte, offset0, length, offset int, h uint64) error {
+func (dt *deltaTable) addBlock(data []byte, offset0, length, offset int, h uint32) error {
if length == 0 {
return nil
}
@@ -205,22 +200,22 @@ func (dt *deltaTable) addBlock(data []byte, offset0, length, offset int, h uint6
return nil
}
dt.offs[idx] = uint32(dt.nblocks + 1)
- dt.blocks[dt.nblocks] = deltaBlock{
- length: length,
- offset: offset,
- hash: h,
- }
+ dt.blocks[dt.nblocks] = deltaBlock{
+ length: length,
+ offset: offset,
+ hash: h,
+ }
dt.nblocks++
dt.len++
return nil
}
-func (dt *deltaTable) lookupBlock(chunk []byte, length int, seed uint64, base []byte, baseOffset0 int) *deltaBlock {
+func (dt *deltaTable) lookupBlock(chunk []byte, length int, seed uint32, base []byte, baseOffset0 int) *deltaBlock {
if dt == nil || dt.size == 0 {
return nil
}
h := deltaHashBlock(chunk, seed)
- for i := int(h % uint64(dt.size)); dt.offs[i] != 0; i = (i + 1) % dt.size {
+ for i := int(h % uint32(dt.size)); dt.offs[i] != 0; i = (i + 1) % dt.size {
block := &dt.blocks[dt.offs[i]-1]
if block.hash != h || block.length != length {
continue
@@ -236,11 +231,11 @@ func (dt *deltaTable) lookupBlock(chunk []byte, length int, seed uint64, base []
return nil
}
-func (dt *deltaTable) lookupSlot(data []byte, offset0, offset, length int, h uint64) (int, bool) {
+func (dt *deltaTable) lookupSlot(data []byte, offset0, offset, length int, h uint32) (int, bool) {
if dt == nil || dt.size == 0 {
return 0, false
}
- for i := int(h % uint64(dt.size)); ; i = (i + 1) % dt.size {
+ for i := int(h % uint32(dt.size)); ; i = (i + 1) % dt.size {
if dt.offs[i] == 0 {
return i, false
}
@@ -278,7 +273,7 @@ func (dt *deltaTable) resize() error {
dt.offs = make([]uint32, dt.size)
for i := 0; i < dt.nblocks; i++ {
block := &dt.blocks[i]
- idx := int(block.hash % uint64(dt.size))
+ idx := int(block.hash % uint32(dt.size))
for dt.offs[idx] != 0 {
idx = (idx + 1) % dt.size
}
diff --git a/delta_write_encode.go b/delta_write_encode.go
index 9e5e4e72..66c77052 100644
--- a/delta_write_encode.go
+++ b/delta_write_encode.go
@@ -89,7 +89,7 @@ func deltaEncode(baseSize, resultSize int, instr []deltaInstruction) ([]byte, er
return out, nil
}
-func deltaTry(base, target []byte, seed uint64, minSavings int) ([]byte, bool) {
+func deltaTry(base, target []byte, seed uint32, minSavings int) ([]byte, bool) {
if minSavings < 0 {
minSavings = 0
}
diff --git a/delta_write_select.go b/delta_write_select.go
index 9113b80f..ad8e0d0e 100644
--- a/delta_write_select.go
+++ b/delta_write_select.go
@@ -26,7 +26,7 @@ func (ctx *deltaContext) addCandidate(obj *objectToPack) {
}
}
-func pickDeltaBase(ctx *deltaContext, obj *objectToPack, seed uint64, minSavings, maxDepth int) (*objectToPack, []byte) {
+func pickDeltaBase(ctx *deltaContext, obj *objectToPack, seed uint32, minSavings, maxDepth int) (*objectToPack, []byte) {
if ctx == nil || len(ctx.candidates) == 0 {
return nil, nil
}
diff --git a/packed_write_pack.go b/packed_write_pack.go
index 7e79b2ef..e6304e64 100644
--- a/packed_write_pack.go
+++ b/packed_write_pack.go
@@ -306,14 +306,14 @@ func (repo *Repository) packWrite(w io.Writer, objects []Hash, opts packWriteOpt
}
var dctx deltaContext
- var deltaSeed uint64
+ var deltaSeed uint32
if opts.EnableDeltas {
dctx.window = defaultDeltaWindow
- var seedBytes [8]byte
+ var seedBytes [4]byte
if _, err := rand.Read(seedBytes[:]); err != nil {
return Hash{}, err
}
- deltaSeed = binary.LittleEndian.Uint64(seedBytes[:])
+ deltaSeed = binary.LittleEndian.Uint32(seedBytes[:])
}
for _, id := range objects {