Home Reference Source

src/utils/di/HashSum.js

/* https://github.com/bevacqua/hash-sum */
'use strict';

function pad(hash, len) {
    while (hash.length < len) {
        hash = '0' + hash;
    }
    return hash;
}

function fold(hash, text) {
    var i;
    var chr;
    var len;
    if (text.length === 0) {
        return hash;
    }
    for (i = 0, len = text.length; i < len; i++) {
        chr = text.charCodeAt(i);
        hash = ((hash << 5) - hash) + chr;
        hash |= 0;
    }
    return hash < 0 ? hash * -2 : hash;
}

function foldObject(hash, o, seen) {
    return Object.keys(o).sort().reduce(foldKey, hash);
    function foldKey(hash, key) {
        return foldValue(hash, o[key], key, seen);
    }
}

function foldValue(input, value, key, seen) {
    var hash = fold(fold(fold(input, key), toString(value)), typeof value);
    if (value === null) {
        return fold(hash, 'null');
    }
    if (value === undefined) {
        return fold(hash, 'undefined');
    }
    if (typeof value === 'object') {
        if (seen.indexOf(value) !== -1) {
            return fold(hash, '[Circular]' + key);
        }
        seen.push(value);
        return foldObject(hash, value, seen);
    }
    return fold(hash, value.toString());
}

function toString(o) {
    return Object.prototype.toString.call(o);
}

function sum(o) {
    return pad(foldValue(0, o, '', []).toString(16), 8);
}

module.exports = sum;