aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/iobuffer.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/iobuffer.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/iobuffer.cpp')
-rw-r--r--src/zencore/iobuffer.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/zencore/iobuffer.cpp b/src/zencore/iobuffer.cpp
index 54f2aaee8..c8bc4a629 100644
--- a/src/zencore/iobuffer.cpp
+++ b/src/zencore/iobuffer.cpp
@@ -704,8 +704,25 @@ IoBufferBuilder::MakeFromTemporaryFile(const std::filesystem::path& FileName)
IoHash
HashBuffer(IoBuffer& Buffer)
{
- // TODO: handle disk buffers with special path
- return IoHash::HashBuffer(Buffer.Data(), Buffer.Size());
+ size_t BufferSize = Buffer.Size();
+ if (BufferSize >= (65536 + 32768))
+ {
+ IoBufferFileReference _;
+ if (Buffer.GetFileReference(/* out */ _))
+ {
+ size_t Offset = 0;
+ IoHashStream HashStream;
+ while (Offset < BufferSize)
+ {
+ size_t ChunkSize = Min<size_t>(BufferSize - Offset, 65536u);
+ IoBuffer SubRange(Buffer, Offset, ChunkSize);
+ HashStream.Append(SubRange.GetData(), SubRange.GetSize());
+ Offset += ChunkSize;
+ }
+ return HashStream.GetHash();
+ }
+ }
+ return IoHash::HashBuffer(Buffer.Data(), BufferSize);
}
//////////////////////////////////////////////////////////////////////////