Skip to content

Commit 538c193

Browse files
committed
Fix CRC32
1 parent fef0261 commit 538c193

1 file changed

Lines changed: 24 additions & 5 deletions

File tree

UnityAsset.NET/CRC32.cs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public static uint CalculateCRC32(byte[] data, uint initialCrc = 0)
7676
int start = i * partSize;
7777
int length = Math.Min(partSize, data.Length - start);
7878

79-
uint crc = ~initialCrc;
79+
uint crc = 0xFFFFFFFF;
8080
var span = data.AsSpan(start, length);
8181
foreach (var b in span)
8282
{
@@ -95,12 +95,31 @@ public static uint CalculateCRC32(byte[] data, uint initialCrc = 0)
9595

9696
public static uint CalculateCRC32(List<byte> data, uint initialCrc = 0)
9797
{
98-
uint crc = ~initialCrc;
99-
foreach (var b in data)
98+
int coreCount = Environment.ProcessorCount;
99+
int partSize = (data.Count + coreCount - 1) / coreCount;
100+
101+
uint[] results = new uint[coreCount];
102+
103+
Parallel.For(0, coreCount, i =>
100104
{
101-
crc = (crc >> 8) ^ Crc32Table[(crc ^ b) & 0xFF];
105+
int start = i * partSize;
106+
int length = Math.Min(partSize, data.Count - start);
107+
108+
uint crc = 0xFFFFFFFF;
109+
var span = data.ToArray().AsSpan(start, length);
110+
foreach (var b in span)
111+
{
112+
crc = (crc >> 8) ^ Crc32Table[(crc ^ b) & 0xFF];
113+
}
114+
results[i] = ~crc;
115+
});
116+
117+
uint finalCrc = ~initialCrc;
118+
foreach (var crc in results)
119+
{
120+
finalCrc = (finalCrc >> 8) ^ Crc32Table[(finalCrc ^ crc) & 0xFF];
102121
}
103-
return ~crc;
122+
return ~finalCrc;
104123
}
105124

106125
public static uint CalculateCRC32(Stream data, uint initialCrc = 0)

0 commit comments

Comments
 (0)