Skip to content

Instantly share code, notes, and snippets.

@azat
Created May 21, 2012 12:40
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save azat/2762138 to your computer and use it in GitHub Desktop.
Save azat/2762138 to your computer and use it in GitHub Desktop.
crc32 javascript implementation
// @link http://www.digsys.se/JavaScript/CRC.aspx
var crc32 = {
// CRC polynomial 0xEDB88320
tab: [ // integer because this is a copy-paste from json string
0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,
249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,
498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,
325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,
997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,
901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,
651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,
671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,
1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,
2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,
1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,
1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,
1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,
1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,
1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,
1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,
3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,
3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,
4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,
4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,
3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,
3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,
3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,
3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,
2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,
2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,
2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,
2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,
2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,
2932959818,3654703836,1088359270,936918000,2847714899,3736837829,1202900863,817233897,
3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,
3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117
],
get: function(str) {
var crc = 0xFFFFFFFF;
for (var n = 0; n < str.length; ++n) {
crc = this.tab[(crc^str.charCodeAt(n))&0xFF]^((crc>>8)&0xFFFFFF);
}
return crc^0xFFFFFFFF;
}
};
@bryc
Copy link

bryc commented Nov 29, 2016

Lookup table can be generated in 3 lines, no need for a huge array:

var crc32 = {
	tab: function() {
		for(var i=256, tbl=[], crc, j; i--; tbl[i]=crc>>>0){
			j=8;for(crc=i;j--;)crc=crc&1?crc>>>1^0xEDB88320:crc>>>1;
		} return tbl;
        }(),
	get: function(str) {
		for(var n=0, crc=0xFFFFFFFF; n<str.length; ++n)
			crc=this.tab[(crc^str.charCodeAt(n))&255]^crc>>8&0xFFFFFF;
		return crc^0xFFFFFFFF;
	}
};

All in one function:

var crc32 = function(str) {
	for(var i=256, tbl=[], crc, j; i--; tbl[i]=crc>>>0){
		j=8;for(crc=i;j--;)crc=crc&1?crc>>>1^0xEDB88320:crc>>>1;
	}
	return function(str) {
		for(var n=0, crc=-1; n<str.length; ++n)
			crc=tbl[crc&255^str.charCodeAt(n)]^crc>>>8;
		return crc^-1;
	}
}();

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment