aboutsummaryrefslogtreecommitdiff
path: root/node_modules/hash-sum/hash-sum.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/hash-sum/hash-sum.js')
-rw-r--r--node_modules/hash-sum/hash-sum.js58
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;