UNPKG

talisman

Version:

Straightforward fuzzy matching, information retrieval and NLP building blocks for JavaScript.

67 lines (60 loc) 1.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = crc32; /** * Talisman hash/crc32 * ==================== * * JavaScript implementation of the CRC32 hash for UTF-8 strings. * * [Reference]: https://en.wikipedia.org/wiki/Cyclic_redundancy_check */ /** * Constants. */ var TABLE = new Int32Array(256); for (var c = 0, n = 0; n !== 256; n++) { c = n; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1; TABLE[n] = c; } /** * Computes the CRC32 hash for the given UTF-8 string. * * @param {string} string - The string to hash. * @return {number} - The signed CRC32 hash. */ function crc32(string) { var C = -1; for (var i = 0, l = string.length, _c, d; i < l;) { _c = string.charCodeAt(i++); if (_c < 0x80) { C = C >>> 8 ^ TABLE[(C ^ _c) & 0xFF]; } else if (_c < 0x800) { C = C >>> 8 ^ TABLE[(C ^ (192 | _c >> 6 & 31)) & 0xFF]; C = C >>> 8 ^ TABLE[(C ^ (128 | _c & 63)) & 0xFF]; } else if (_c >= 0xD800 && _c < 0xE000) { _c = (_c & 1023) + 64; d = string.charCodeAt(i++) & 1023; C = C >>> 8 ^ TABLE[(C ^ (240 | _c >> 8 & 7)) & 0xFF]; C = C >>> 8 ^ TABLE[(C ^ (128 | _c >> 2 & 63)) & 0xFF]; C = C >>> 8 ^ TABLE[(C ^ (128 | d >> 6 & 15 | (_c & 3) << 4)) & 0xFF]; C = C >>> 8 ^ TABLE[(C ^ (128 | d & 63)) & 0xFF]; } else { C = C >>> 8 ^ TABLE[(C ^ (224 | _c >> 12 & 15)) & 0xFF]; C = C >>> 8 ^ TABLE[(C ^ (128 | _c >> 6 & 63)) & 0xFF]; C = C >>> 8 ^ TABLE[(C ^ (128 | _c & 63)) & 0xFF]; } } return C ^ -1; } module.exports = exports["default"];