Skip to content

Commit b112e14

Browse files
committed
Parallel Calculate CRC32
1 parent f231140 commit b112e14

1 file changed

Lines changed: 23 additions & 4 deletions

File tree

UnityAsset.NET/CRC32.cs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,31 @@ public static uint rCRC(uint targetCrc, uint originalCrc)
6666

6767
public static uint CalculateCRC32(byte[] data, uint initialCrc = 0)
6868
{
69-
uint crc = ~initialCrc;
70-
foreach (var b in data)
69+
int coreCount = Environment.ProcessorCount;
70+
int partSize = (data.Length + coreCount - 1) / coreCount;
71+
72+
uint[] results = new uint[coreCount];
73+
74+
Parallel.For(0, coreCount, i =>
7175
{
72-
crc = (crc >> 8) ^ Crc32Table[(crc ^ b) & 0xFF];
76+
int start = i * partSize;
77+
int length = Math.Min(partSize, data.Length - start);
78+
79+
uint crc = ~initialCrc;
80+
var span = data.AsSpan(start, length);
81+
foreach (var b in span)
82+
{
83+
crc = (crc >> 8) ^ Crc32Table[(crc ^ b) & 0xFF];
84+
}
85+
results[i] = ~crc;
86+
});
87+
88+
uint finalCrc = ~initialCrc;
89+
foreach (var crc in results)
90+
{
91+
finalCrc = (finalCrc >> 8) ^ Crc32Table[(finalCrc ^ crc) & 0xFF];
7392
}
74-
return ~crc;
93+
return ~finalCrc;
7594
}
7695

7796
public static uint CalculateCRC32(List<byte> data, uint initialCrc = 0)

0 commit comments

Comments
 (0)