diff options
author | Bjørn Erik Pedersen <[email protected]> | 2024-07-30 12:52:54 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2024-07-31 16:44:06 +0200 |
commit | d5eda13cb2e57998210b66e080dc96e95b38e5f0 (patch) | |
tree | b52bc254cf9d6dcb768a491d73c725d7104dd9cd /resources | |
parent | 8b5d796989cf0798ee61003159ba8b332675bdf2 (diff) | |
download | hugo-d5eda13cb2e57998210b66e080dc96e95b38e5f0.tar.gz hugo-d5eda13cb2e57998210b66e080dc96e95b38e5f0.zip |
Replace the MD5 hashing of images with xxHash
Note that we only use this for change detection.
The previous implementation invoked `MD5FromReaderFast` that created a MD5 has from 8 64 bytes chunks in the file, which is obviously very fast. The new implementation creates the hash from the entire file and ... seems to be even more effective:
```
name old time/op new time/op delta
HashImage-10 9.45µs ±21% 10.89µs ± 1% ~ (p=0.343 n=4+4)
name old alloc/op new alloc/op delta
HashImage-10 144B ± 0% 8B ± 0% -94.44% (p=0.029 n=4+4)
name old allocs/op new allocs/op delta
HashImage-10 4.00 ± 0% 1.00 ± 0% -75.00% (p=0.029 n=4+4)
```
Diffstat (limited to 'resources')
-rw-r--r-- | resources/image.go | 2 | ||||
-rw-r--r-- | resources/resource.go | 13 |
2 files changed, 8 insertions, 7 deletions
diff --git a/resources/image.go b/resources/image.go index 188f49624..56f0981f2 100644 --- a/resources/image.go +++ b/resources/image.go @@ -493,7 +493,7 @@ func (i *imageResource) relTargetPathFromConfig(conf images.ImageConfig) interna } h := i.hash() - idStr := fmt.Sprintf("_hu%s_%d", h, i.size()) + idStr := fmt.Sprintf("_hu%d_%d", h, i.size()) // Do not change for no good reason. const md5Threshold = 100 diff --git a/resources/resource.go b/resources/resource.go index 19270307e..cc7008e5a 100644 --- a/resources/resource.go +++ b/resources/resource.go @@ -26,6 +26,7 @@ import ( "github.com/gohugoio/hugo/identity" "github.com/gohugoio/hugo/resources/internal" + "github.com/gohugoio/hugo/common/hashing" "github.com/gohugoio/hugo/common/herrors" "github.com/gohugoio/hugo/common/paths" @@ -307,7 +308,7 @@ type fileInfo interface { } type hashProvider interface { - hash() string + hash() uint64 } var _ resource.StaleInfo = (*StaleValue[any])(nil) @@ -403,7 +404,7 @@ func (l *genericResource) size() int64 { return l.h.size } -func (l *genericResource) hash() string { +func (l *genericResource) hash() uint64 { if err := l.h.init(l); err != nil { panic(err) } @@ -628,7 +629,7 @@ type targetPather interface { } type resourceHash struct { - value string + value uint64 size int64 initOnce sync.Once } @@ -636,7 +637,7 @@ type resourceHash struct { func (r *resourceHash) init(l hugio.ReadSeekCloserProvider) error { var initErr error r.initOnce.Do(func() { - var hash string + var hash uint64 var size int64 f, err := l.ReadSeekCloser() if err != nil { @@ -656,6 +657,6 @@ func (r *resourceHash) init(l hugio.ReadSeekCloserProvider) error { return initErr } -func hashImage(r io.ReadSeeker) (string, int64, error) { - return helpers.MD5FromReaderFast(r) +func hashImage(r io.ReadSeeker) (uint64, int64, error) { + return hashing.XXHashFromReader(r) } |