diff options
Diffstat (limited to 'node_modules/hash-sum/hash-sum.js')
| -rw-r--r-- | node_modules/hash-sum/hash-sum.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/node_modules/hash-sum/hash-sum.js b/node_modules/hash-sum/hash-sum.js new file mode 100644 index 00000000..77b2030d --- /dev/null +++ b/node_modules/hash-sum/hash-sum.js @@ -0,0 +1,58 @@ +'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; |
