@@ -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