"use strict"; const baseEncodeTables = { 26: "abcdefghijklmnopqrstuvwxyz", 32: "123456789abcdefghjkmnpqrstuvwxyz", // no 0lio 36: "0123456789abcdefghijklmnopqrstuvwxyz", 49: "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ", // no lIO 52: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 58: "123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ", // no 0lIO 62: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", 64: "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_" }; function encodeBufferToBase(buffer, base) { const encodeTable = baseEncodeTables[base]; if(!encodeTable) throw new Error("Unknown encoding base" + base); const readLength = buffer.length; const Big = require("big.js"); Big.RM = Big.DP = 0; let b = new Big(0); for(let i = readLength - 1; i >= 0; i--) { b = b.times(256).plus(buffer[i]); } let output = ""; while(b.gt(0)) { output = encodeTable[b.mod(base)] + output; b = b.div(base); } Big.DP = 20; Big.RM = 1; return output; } function getHashDigest(buffer, hashType, digestType, maxLength) { hashType = hashType || "md5"; maxLength = maxLength || 9999; const hash = require("crypto").createHash(hashType); hash.update(buffer); if(digestType === "base26" || digestType === "base32" || digestType === "base36" || digestType === "base49" || digestType === "base52" || digestType === "base58" || digestType === "base62" || digestType === "base64") { return encodeBufferToBase(hash.digest(), digestType.substr(4)).substr(0, maxLength); } else { return hash.digest(digestType || "hex").substr(0, maxLength); } } module.exports = getHashDigest;