34 lines
930 B
JavaScript
34 lines
930 B
JavaScript
|
'use strict';
|
||
|
var intSize = 4;
|
||
|
var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(0);
|
||
|
var chrsz = 8;
|
||
|
|
||
|
function toArray(buf, bigEndian) {
|
||
|
if ((buf.length % intSize) !== 0) {
|
||
|
var len = buf.length + (intSize - (buf.length % intSize));
|
||
|
buf = Buffer.concat([buf, zeroBuffer], len);
|
||
|
}
|
||
|
|
||
|
var arr = [];
|
||
|
var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE;
|
||
|
for (var i = 0; i < buf.length; i += intSize) {
|
||
|
arr.push(fn.call(buf, i));
|
||
|
}
|
||
|
return arr;
|
||
|
}
|
||
|
|
||
|
function toBuffer(arr, size, bigEndian) {
|
||
|
var buf = new Buffer(size);
|
||
|
var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE;
|
||
|
for (var i = 0; i < arr.length; i++) {
|
||
|
fn.call(buf, arr[i], i * 4, true);
|
||
|
}
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
function hash(buf, fn, hashSize, bigEndian) {
|
||
|
if (!Buffer.isBuffer(buf)) buf = new Buffer(buf);
|
||
|
var arr = fn(toArray(buf, bigEndian), buf.length * chrsz);
|
||
|
return toBuffer(arr, hashSize, bigEndian);
|
||
|
}
|
||
|
exports.hash = hash;
|