aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/blake3.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-02-26 19:08:27 +0100
committerGitHub <[email protected]>2024-02-26 19:08:27 +0100
commit8672d2235e73545abde15f075934f68495adeaf3 (patch)
tree421443b0eb76910c612bb219354a9306081cca10 /src/zencore/blake3.cpp
parentadding context to http.sys error message (diff)
downloadzen-8672d2235e73545abde15f075934f68495adeaf3.tar.xz
zen-8672d2235e73545abde15f075934f68495adeaf3.zip
hashing fixes (#657)
* move structuredcachestore tests to zenstore-test * Don't materialize entire files when hashing if it is a large files * rewrite CompositeBuffer::Mid to never materialize buffers
Diffstat (limited to 'src/zencore/blake3.cpp')
-rw-r--r--src/zencore/blake3.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/zencore/blake3.cpp b/src/zencore/blake3.cpp
index 89826ae5d..bdbc8fb3e 100644
--- a/src/zencore/blake3.cpp
+++ b/src/zencore/blake3.cpp
@@ -45,7 +45,23 @@ BLAKE3::HashBuffer(const CompositeBuffer& Buffer)
for (const SharedBuffer& Segment : Buffer.GetSegments())
{
- blake3_hasher_update(&Hasher, Segment.GetData(), Segment.GetSize());
+ size_t SegmentSize = Segment.GetSize();
+ if (SegmentSize >= (65536 + 32768) && Segment.IsFileReference())
+ {
+ const IoBuffer SegmentBuffer = Segment.AsIoBuffer();
+ size_t Offset = 0;
+ while (Offset < SegmentSize)
+ {
+ size_t ChunkSize = Min<size_t>(SegmentSize - Offset, 65536u);
+ IoBuffer SubRange(SegmentBuffer, Offset, ChunkSize);
+ blake3_hasher_update(&Hasher, SubRange.GetData(), ChunkSize);
+ Offset += ChunkSize;
+ }
+ }
+ else
+ {
+ blake3_hasher_update(&Hasher, Segment.GetData(), SegmentSize);
+ }
}
blake3_hasher_finalize(&Hasher, Hash.Hash, sizeof Hash.Hash);