Skip to content

Commit

Permalink
Improved CRC32 to be calculated by ulong batches
Browse files Browse the repository at this point in the history
  • Loading branch information
Lanayx committed Sep 27, 2023
1 parent 4c0b9dc commit 669206c
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 15 deletions.
41 changes: 29 additions & 12 deletions src/Pulsar.Client.Proto/Crc32c.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.IO;
using System;
using System.IO;
using System.Numerics;
using Microsoft.IO;

Expand All @@ -14,25 +15,41 @@ internal static uint GetForRMS(RecyclableMemoryStream stream, int size)
foreach (var memory in memorySequence)
{
var span = memory.Span;
var currentBlockLength = span.Length;
var i = 0;
while (size-- > 0 && i < currentBlockLength)
{
crc = BitOperations.Crc32C(crc, span[i]);
i++;
}
crc = CrcAlgorithm(size, span, crc);
}
return crc ^ ~0U; //0xFFFFFFFF
}

private static uint CrcAlgorithm(int size, ReadOnlySpan<byte> span, uint crc)
{
var currentBlockLength = span.Length;
var i = 0;
var bigStepsCount = currentBlockLength / 8;
while (i < bigStepsCount)
{
var start = i * 8;
var batch = BitConverter.ToUInt64(span.Slice(start, 8));
crc = BitOperations.Crc32C(crc, batch);
i++;
}

i = bigStepsCount * 8;
while (size > 0 && i < currentBlockLength)
{
crc = BitOperations.Crc32C(crc, span[i]);
size--;
i++;
}
return crc;
}

internal static uint GetForMS(MemoryStream stream, int size)
{
var crc = ~0U; //0xFFFFFFFF
var buf = stream.GetBuffer();
var offset = stream.Position;
for (var i = 0; i < size; i++)
crc = BitOperations.Crc32C(crc, buf[offset+i]);

var offset = (int) stream.Position;
var span = buf.AsSpan(offset);
crc = CrcAlgorithm(size, span, crc);
return crc ^ ~0U; //0xFFFFFFFF
}
}
Expand Down
2 changes: 0 additions & 2 deletions src/Pulsar.Client.Proto/Pulsar.Client.Proto.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,5 @@
<ItemGroup>
<PackageReference Include="protobuf-net" Version="3.2.26" />
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.2" />
<!--Microsoft-->
<PackageReference Include="System.Text.Json" Version="8.0.0-rc.1.23419.4" />
</ItemGroup>
</Project>
1 change: 0 additions & 1 deletion src/Pulsar.Client/Pulsar.Client.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0-rc.1.23419.4" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0-rc.1.23419.4" />
<PackageReference Include="System.IO.Pipelines" Version="8.0.0-rc.1.23419.4" />
<PackageReference Include="System.Text.Json" Version="8.0.0-rc.1.23419.4" />
<PackageReference Include="System.Threading.Channels" Version="8.0.0-rc.1.23419.4" />
</ItemGroup>
<ItemGroup>
Expand Down

0 comments on commit 669206c

Please sign in to comment.