File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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 )
You can’t perform that action at this time.
0 commit comments