aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/iohash.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/iohash.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/iohash.cpp')
-rw-r--r--src/zencore/iohash.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/zencore/iohash.cpp b/src/zencore/iohash.cpp
index 77076c133..cedee913a 100644
--- a/src/zencore/iohash.cpp
+++ b/src/zencore/iohash.cpp
@@ -31,7 +31,23 @@ IoHash::HashBuffer(const CompositeBuffer& Buffer)
for (const SharedBuffer& Segment : Buffer.GetSegments())
{
- Hasher.Append(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);
+ Hasher.Append(SubRange.GetData(), ChunkSize);
+ Offset += ChunkSize;
+ }
+ }
+ else
+ {
+ Hasher.Append(Segment.GetData(), SegmentSize);
+ }
}
return Hasher.GetHash();