Skip to content
This repository has been archived by the owner on Apr 2, 2020. It is now read-only.

Commit

Permalink
add a much faster function as checkCRCHash
Browse files Browse the repository at this point in the history
src: https://github.com/esterTion/BiliBili_crc2mid/blob/master/crc32.htm
authored by https://github.com/esterTion 

minified checkCRCHash function:
window.checkCRCHash=new function(){var h=function(){for(var d,e="undefined"!==typeof Int32Array?new Int32Array(256):Array(256),b=0;256!=b;++b){d=b;for(var c=0;8>c;c++)d=d&1?-306674912^d>>>1:d>>>1;e[b]=d}return e}(),f=Array(4);return function(d){var e=parseInt(d,16)^4294967295,b,c;for(d=3;0<=d;d--){a:{for(b=0;256>b;b++)if(h[b]>>>24==e>>>8*d)break a;b=-1}f[3-d]=b;b=h[f[3-d]];e^=b>>>8*(3-d)}for(d=0;1E5>d;d++){e=d;"string"!=typeof e&&(e=""+e);b=4294967295;for(var k=e.length,g=void 0,l=0;l<k;++l)g=(b^e.charCodeAt(l))&
255,b=b>>>8^h[g];e=g;if(e==f[3]){c=d;"string"!=typeof c&&(c=""+c);e=4294967295;b=c.length;for(g=0;g<b;++g)k=(e^c.charCodeAt(g))&255,e=e>>>8^h[k];b=e;c=b&255^f[2];57>=c&&48<=c?(e=""+(c-48),b=h[f[2]]^b>>>8,c=b&255^f[1],57>=c&&48<=c?(e+=c-48,b=h[f[1]]^b>>>8,c=b&255^f[0],c=57>=c&&48<=c?[1,e+(c-48)]:[0]):c=[0]):c=[0];if(c[0])break}}return 1E5==d?-1:d+""+c[1]}};
  • Loading branch information
myfreeer committed Nov 26, 2016
1 parent 6c6d195 commit 268f248
Showing 1 changed file with 94 additions and 0 deletions.
94 changes: 94 additions & 0 deletions localCommentHashToUserMid.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,100 @@ var CRC32 = {};
CRC32.bstr = crc32_bstr;
})(CRC32);

/* Usage: checkCRCHash(String hash)
* the return value would be mid, or -1 if process fails
* Speed test:
var t0 = performance.now();
checkCRCHash('444283f9');//should be 40000000
console.log("Call to checkCRCHash took " + (performance.now() - t0) + " milliseconds.");
*/
var checkCRCHash = new (function () {
'use strict';
var startTime = performance.now();
function signed_crc_table() {
var c = 0,
table = typeof Int32Array !== 'undefined' ? new Int32Array(256) : new Array(256);
for (var n = 0; n != 256; ++n) {
c = n;
for (var x = 0; x < 8; x++) {
c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
}
table[n] = c;
}
return table;
}
var crctable = signed_crc_table();
var crc32 = function crc32(input) {
if (typeof input != 'string') input = "" + input;
var crcstart = 0xFFFFFFFF,
len = input.length,
index;
for (var i = 0; i < len; ++i) {
index = (crcstart ^ input.charCodeAt(i)) & 0xff;
crcstart = crcstart >>> 8 ^ crctable[index];
}
return crcstart;
},
crc32lastindex = function crc32lastindex(input) {
if (typeof input != 'string') input = "" + input;
var crcstart = 0xFFFFFFFF,
len = input.length,
index;
for (var i = 0; i < len; ++i) {
index = (crcstart ^ input.charCodeAt(i)) & 0xff;
crcstart = crcstart >>> 8 ^ crctable[index];
}
return index;
},
getcrcindex = function getcrcindex(t) {
for (var i = 0; i < 256; i++) {
if (crctable[i] >>> 24 == t) return i;
}
return -1;
},
deepCheck = function deepCheck(i, index) {
var tc = 0x00,
str = '',
hash = crc32(i);
tc = hash & 0xff ^ index[2];
if (!(tc <= 57 && tc >= 48)) return [0];
str += tc - 48;
hash = crctable[index[2]] ^ hash >>> 8;
tc = hash & 0xff ^ index[1];
if (!(tc <= 57 && tc >= 48)) return [0];
str += tc - 48;
hash = crctable[index[1]] ^ hash >>> 8;
tc = hash & 0xff ^ index[0];
if (!(tc <= 57 && tc >= 48)) return [0];
str += tc - 48;
hash = crctable[index[0]] ^ hash >>> 8;
return [1, str];
};
var index = new Array(4);
console.log('初始化耗时:' + (performance.now() - startTime));
return function(input) {
var ht = parseInt(input, 16) ^ 0xffffffff,
snum,
i,
lastindex,
deepCheckData;
for (i = 3; i >= 0; i--) {
index[3 - i] = getcrcindex(ht >>> i * 8);
snum = crctable[index[3 - i]];
ht ^= snum >>> (3 - i) * 8;
}
for (i = 0; i < 100000; i++) {
lastindex = crc32lastindex(i);
if (lastindex == index[3]) {
deepCheckData = deepCheck(i, index);
if (deepCheckData[0]) break;
}
}
if (i == 100000) return -1;
return i + '' + deepCheckData[1];
};
})();

/* Usage: checkCommentHash(String hash, int maximumMid, int minimumMid)
* argument hash is required, maximumMid and minimumMid is optional
* maximumMid would be 65000000 if not set, minimumMid would be 0 if not set
Expand Down

0 comments on commit 268f248

Please sign in to comment.