| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 | 
							- '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;
 
 
  |