aboutsummaryrefslogtreecommitdiff
path: root/node_modules/hash-sum/hash-sum.js
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/hash-sum/hash-sum.js
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
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;