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. }