CRC32.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. using System;
  2. using System.Security.Cryptography;
  3. namespace wf
  4. {
  5. public class CRC32 : HashAlgorithm
  6. {
  7. public override void Initialize()
  8. {
  9. this.result = CRC32.MaskValue;
  10. }
  11. public override int HashSize
  12. {
  13. get
  14. {
  15. return 32;
  16. }
  17. }
  18. public uint ComputeChecksum(byte[] bytes)
  19. {
  20. uint num = CRC32.MaskValue;
  21. for (int i = 0; i < bytes.Length; i++)
  22. {
  23. byte b = (byte)((num & 255U) ^ (uint)bytes[i]);
  24. num = (num >> 8 ^ CRC32.Crc32tabel[(int)b]);
  25. }
  26. return ~num;
  27. }
  28. protected override void HashCore(byte[] array, int ibStart, int cbSize)
  29. {
  30. while (--cbSize >= 0)
  31. {
  32. this.result = (CRC32.Crc32tabel[(int)((UIntPtr)((this.result ^ (uint)array[ibStart++]) & 255U))] ^ this.result >> 8);
  33. }
  34. }
  35. protected override byte[] HashFinal()
  36. {
  37. this.result ^= CRC32.MaskValue;
  38. this.HashValue = new byte[]
  39. {
  40. (byte)(this.result >> 24 & 255U),
  41. (byte)(this.result >> 16 & 255U),
  42. (byte)(this.result >> 8 & 255U),
  43. (byte)(this.result & 255U)
  44. };
  45. return this.HashValue;
  46. }
  47. private static readonly uint[] Crc32tabel = new uint[]
  48. {
  49. 0U,
  50. 1996959894U,
  51. 3993919788U,
  52. 2567524794U,
  53. 124634137U,
  54. 1886057615U,
  55. 3915621685U,
  56. 2657392035U,
  57. 249268274U,
  58. 2044508324U,
  59. 3772115230U,
  60. 2547177864U,
  61. 162941995U,
  62. 2125561021U,
  63. 3887607047U,
  64. 2428444049U,
  65. 498536548U,
  66. 1789927666U,
  67. 4089016648U,
  68. 2227061214U,
  69. 450548861U,
  70. 1843258603U,
  71. 4107580753U,
  72. 2211677639U,
  73. 325883990U,
  74. 1684777152U,
  75. 4251122042U,
  76. 2321926636U,
  77. 335633487U,
  78. 1661365465U,
  79. 4195302755U,
  80. 2366115317U,
  81. 997073096U,
  82. 1281953886U,
  83. 3579855332U,
  84. 2724688242U,
  85. 1006888145U,
  86. 1258607687U,
  87. 3524101629U,
  88. 2768942443U,
  89. 901097722U,
  90. 1119000684U,
  91. 3686517206U,
  92. 2898065728U,
  93. 853044451U,
  94. 1172266101U,
  95. 3705015759U,
  96. 2882616665U,
  97. 651767980U,
  98. 1373503546U,
  99. 3369554304U,
  100. 3218104598U,
  101. 565507253U,
  102. 1454621731U,
  103. 3485111705U,
  104. 3099436303U,
  105. 671266974U,
  106. 1594198024U,
  107. 3322730930U,
  108. 2970347812U,
  109. 795835527U,
  110. 1483230225U,
  111. 3244367275U,
  112. 3060149565U,
  113. 1994146192U,
  114. 31158534U,
  115. 2563907772U,
  116. 4023717930U,
  117. 1907459465U,
  118. 112637215U,
  119. 2680153253U,
  120. 3904427059U,
  121. 2013776290U,
  122. 251722036U,
  123. 2517215374U,
  124. 3775830040U,
  125. 2137656763U,
  126. 141376813U,
  127. 2439277719U,
  128. 3865271297U,
  129. 1802195444U,
  130. 476864866U,
  131. 2238001368U,
  132. 4066508878U,
  133. 1812370925U,
  134. 453092731U,
  135. 2181625025U,
  136. 4111451223U,
  137. 1706088902U,
  138. 314042704U,
  139. 2344532202U,
  140. 4240017532U,
  141. 1658658271U,
  142. 366619977U,
  143. 2362670323U,
  144. 4224994405U,
  145. 1303535960U,
  146. 984961486U,
  147. 2747007092U,
  148. 3569037538U,
  149. 1256170817U,
  150. 1037604311U,
  151. 2765210733U,
  152. 3554079995U,
  153. 1131014506U,
  154. 879679996U,
  155. 2909243462U,
  156. 3663771856U,
  157. 1141124467U,
  158. 855842277U,
  159. 2852801631U,
  160. 3708648649U,
  161. 1342533948U,
  162. 654459306U,
  163. 3188396048U,
  164. 3373015174U,
  165. 1466479909U,
  166. 544179635U,
  167. 3110523913U,
  168. 3462522015U,
  169. 1591671054U,
  170. 702138776U,
  171. 2966460450U,
  172. 3352799412U,
  173. 1504918807U,
  174. 783551873U,
  175. 3082640443U,
  176. 3233442989U,
  177. 3988292384U,
  178. 2596254646U,
  179. 62317068U,
  180. 1957810842U,
  181. 3939845945U,
  182. 2647816111U,
  183. 81470997U,
  184. 1943803523U,
  185. 3814918930U,
  186. 2489596804U,
  187. 225274430U,
  188. 2053790376U,
  189. 3826175755U,
  190. 2466906013U,
  191. 167816743U,
  192. 2097651377U,
  193. 4027552580U,
  194. 2265490386U,
  195. 503444072U,
  196. 1762050814U,
  197. 4150417245U,
  198. 2154129355U,
  199. 426522225U,
  200. 1852507879U,
  201. 4275313526U,
  202. 2312317920U,
  203. 282753626U,
  204. 1742555852U,
  205. 4189708143U,
  206. 2394877945U,
  207. 397917763U,
  208. 1622183637U,
  209. 3604390888U,
  210. 2714866558U,
  211. 953729732U,
  212. 1340076626U,
  213. 3518719985U,
  214. 2797360999U,
  215. 1068828381U,
  216. 1219638859U,
  217. 3624741850U,
  218. 2936675148U,
  219. 906185462U,
  220. 1090812512U,
  221. 3747672003U,
  222. 2825379669U,
  223. 829329135U,
  224. 1181335161U,
  225. 3412177804U,
  226. 3160834842U,
  227. 628085408U,
  228. 1382605366U,
  229. 3423369109U,
  230. 3138078467U,
  231. 570562233U,
  232. 1426400815U,
  233. 3317316542U,
  234. 2998733608U,
  235. 733239954U,
  236. 1555261956U,
  237. 3268935591U,
  238. 3050360625U,
  239. 752459403U,
  240. 1541320221U,
  241. 2607071920U,
  242. 3965973030U,
  243. 1969922972U,
  244. 40735498U,
  245. 2617837225U,
  246. 3943577151U,
  247. 1913087877U,
  248. 83908371U,
  249. 2512341634U,
  250. 3803740692U,
  251. 2075208622U,
  252. 213261112U,
  253. 2463272603U,
  254. 3855990285U,
  255. 2094854071U,
  256. 198958881U,
  257. 2262029012U,
  258. 4057260610U,
  259. 1759359992U,
  260. 534414190U,
  261. 2176718541U,
  262. 4139329115U,
  263. 1873836001U,
  264. 414664567U,
  265. 2282248934U,
  266. 4279200368U,
  267. 1711684554U,
  268. 285281116U,
  269. 2405801727U,
  270. 4167216745U,
  271. 1634467795U,
  272. 376229701U,
  273. 2685067896U,
  274. 3608007406U,
  275. 1308918612U,
  276. 956543938U,
  277. 2808555105U,
  278. 3495958263U,
  279. 1231636301U,
  280. 1047427035U,
  281. 2932959818U,
  282. 3654703836U,
  283. 1088359270U,
  284. 936918000U,
  285. 2847714899U,
  286. 3736837829U,
  287. 1202900863U,
  288. 817233897U,
  289. 3183342108U,
  290. 3401237130U,
  291. 1404277552U,
  292. 615818150U,
  293. 3134207493U,
  294. 3453421203U,
  295. 1423857449U,
  296. 601450431U,
  297. 3009837614U,
  298. 3294710456U,
  299. 1567103746U,
  300. 711928724U,
  301. 3020668471U,
  302. 3272380065U,
  303. 1510334235U,
  304. 755167117U
  305. };
  306. private static readonly uint MaskValue = uint.MaxValue;
  307. private uint result;
  308. }
  309. }