crc32.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. var poly = 0xEDB88320; // reverse polynomial
  2. // build table
  3. function signed_crc_table() {
  4. var c, n, k, table = new Array(256);
  5. for (n = 0; n < 256; n++) {
  6. c = n;
  7. for (k = 0; k < 8; k++) {
  8. if (c & 1) {
  9. c = poly ^ (c >>> 1);
  10. }
  11. else {
  12. c = c >>> 1;
  13. }
  14. }
  15. table[n] = c >>> 0;
  16. }
  17. return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
  18. }
  19. var T = signed_crc_table();
  20. function crc32_str(str, seed = 0) {
  21. var C = seed ^ -1;
  22. for (var i = 0, L = str.length, c, d; i < L;) {
  23. c = str.charCodeAt(i++);
  24. if (c < 0x80) {
  25. C = (C >>> 8) ^ T[(C ^ c) & 0xFF];
  26. }
  27. else if (c < 0x800) {
  28. C = (C >>> 8) ^ T[(C ^ (192 | ((c >> 6) & 31))) & 0xFF];
  29. C = (C >>> 8) ^ T[(C ^ (128 | (c & 63))) & 0xFF];
  30. }
  31. else if (c >= 0xD800 && c < 0xE000) {
  32. c = (c & 1023) + 64;
  33. d = str.charCodeAt(i++) & 1023;
  34. C = (C >>> 8) ^ T[(C ^ (240 | ((c >> 8) & 7))) & 0xFF];
  35. C = (C >>> 8) ^ T[(C ^ (128 | ((c >> 2) & 63))) & 0xFF];
  36. C = (C >>> 8) ^ T[(C ^ (128 | ((d >> 6) & 15) | ((c & 3) << 4))) & 0xFF];
  37. C = (C >>> 8) ^ T[(C ^ (128 | (d & 63))) & 0xFF];
  38. }
  39. else {
  40. C = (C >>> 8) ^ T[(C ^ (224 | ((c >> 12) & 15))) & 0xFF];
  41. C = (C >>> 8) ^ T[(C ^ (128 | ((c >> 6) & 63))) & 0xFF];
  42. C = (C >>> 8) ^ T[(C ^ (128 | (c & 63))) & 0xFF];
  43. }
  44. }
  45. return C ^ -1;
  46. }
  47. function decimalToHex(num) {
  48. var str = (num >>> 0).toString(16);
  49. var padLen = 8 - str.length;
  50. return padLen > 0 ? new Array(padLen + 1).join('0') + str : str;
  51. }
  52. function crc32(str) {
  53. return decimalToHex(crc32_str(str));
  54. }
  55. export default crc32;