From 26105034da4fcce7ac883c899d781f016559310d Mon Sep 17 00:00:00 2001 From: ruki Date: Thu, 8 Nov 2018 00:38:48 +0800 Subject: switch to vuepress --- node_modules/hash-sum/hash-sum.js | 58 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 node_modules/hash-sum/hash-sum.js (limited to 'node_modules/hash-sum/hash-sum.js') 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; -- cgit v1.2.3