UNPKG

dding-fnv

Version:

Hash Fnv-1/Fnv-1a Algorithm in 32/64

85 lines (69 loc) 1.69 kB
/** * create by Linan (linan@dding.cn) * Hash Fnv Algorithm * 64 Hash * version: fnv-1 / fnv-1a * */ var Fnv = require('./fnv.js'); var BigInteger = require("big-integer") /** * [getPrime create] * @return {[type]} [bigInteger] * * 2^40 + 2^8 + 0xb3 = 1099511628211 */ function getPrime(){ var bi1 = BigInteger(2).pow(BigInteger(40)); var bi2 = BigInteger(2).pow(BigInteger(8)); var bi3 = BigInteger('b3', 16); return bi1.add(bi2).add(bi3); } /** * [getMask create] * @return {[type]} [bigInteger] * * 16 max */ function getMask(){ return BigInteger('FFFFFFFFFFFFFFFF', 16); } /** * [hash 64 for fnv-1 verions] * @param {[type]} input [hash target] * @return {[type]} [hash value] */ function version_1(input){ var hash = BigInteger('14695981039346656037', 10); //offset: 14695981039346656037=0xcbf29ce484222325 for(var i=0; i< input.length; i++){ hash = hash.multiply(getPrime()) .xor(BigInteger(input.charCodeAt(i))) .and(getMask()); } return hash; } /** * [hash 64 for fnv-1a verions] * @param {[type]} input [hash target] * @return {[type]} [hash value] */ function version_1a(input){ var hash = BigInteger('14695981039346656037', 10); //offset: 14695981039346656037=0xcbf29ce484222325 for(var i=0; i< input.length; i++){ hash = hash.xor(BigInteger(input.charCodeAt(i))) .multiply(getPrime()) .and(getMask()); } return hash; } module.exports = function(input, version){ input = (typeof input == 'object')? JSON.stringify(input) : input; version = version || '1a'; var value; if(version == '1a'){ value = version_1a(input); }else{ value = version_1(input); } return new Fnv(value, 64); }