| // different ways to id objects | 
| // use a req/res pair, since it's crazy deep and cyclical | 
|   | 
| // sparseFE10 and sigmund are usually pretty close, which is to be expected, | 
| // since they are essentially the same algorithm, except that sigmund handles | 
| // regular expression objects properly. | 
|   | 
|   | 
| var http = require('http') | 
| var util = require('util') | 
| var sigmund = require('./sigmund.js') | 
| var sreq, sres, creq, cres, test | 
|   | 
| http.createServer(function (q, s) { | 
|   sreq = q | 
|   sres = s | 
|   sres.end('ok') | 
|   this.close(function () { setTimeout(function () { | 
|     start() | 
|   }, 200) }) | 
| }).listen(1337, function () { | 
|   creq = http.get({ port: 1337 }) | 
|   creq.on('response', function (s) { cres = s }) | 
| }) | 
|   | 
| function start () { | 
|   test = [sreq, sres, creq, cres] | 
|   // test = sreq | 
|   // sreq.sres = sres | 
|   // sreq.creq = creq | 
|   // sreq.cres = cres | 
|   | 
|   for (var i in exports.compare) { | 
|     console.log(i) | 
|     var hash = exports.compare[i]() | 
|     console.log(hash) | 
|     console.log(hash.length) | 
|     console.log('') | 
|   } | 
|   | 
|   require('bench').runMain() | 
| } | 
|   | 
| function customWs (obj, md, d) { | 
|   d = d || 0 | 
|   var to = typeof obj | 
|   if (to === 'undefined' || to === 'function' || to === null) return '' | 
|   if (d > md || !obj || to !== 'object') return ('' + obj).replace(/[\n ]+/g, '') | 
|   | 
|   if (Array.isArray(obj)) { | 
|     return obj.map(function (i, _, __) { | 
|       return customWs(i, md, d + 1) | 
|     }).reduce(function (a, b) { return a + b }, '') | 
|   } | 
|   | 
|   var keys = Object.keys(obj) | 
|   return keys.map(function (k, _, __) { | 
|     return k + ':' + customWs(obj[k], md, d + 1) | 
|   }).reduce(function (a, b) { return a + b }, '') | 
| } | 
|   | 
| function custom (obj, md, d) { | 
|   d = d || 0 | 
|   var to = typeof obj | 
|   if (to === 'undefined' || to === 'function' || to === null) return '' | 
|   if (d > md || !obj || to !== 'object') return '' + obj | 
|   | 
|   if (Array.isArray(obj)) { | 
|     return obj.map(function (i, _, __) { | 
|       return custom(i, md, d + 1) | 
|     }).reduce(function (a, b) { return a + b }, '') | 
|   } | 
|   | 
|   var keys = Object.keys(obj) | 
|   return keys.map(function (k, _, __) { | 
|     return k + ':' + custom(obj[k], md, d + 1) | 
|   }).reduce(function (a, b) { return a + b }, '') | 
| } | 
|   | 
| function sparseFE2 (obj, maxDepth) { | 
|   var seen = [] | 
|   var soFar = '' | 
|   function ch (v, depth) { | 
|     if (depth > maxDepth) return | 
|     if (typeof v === 'function' || typeof v === 'undefined') return | 
|     if (typeof v !== 'object' || !v) { | 
|       soFar += v | 
|       return | 
|     } | 
|     if (seen.indexOf(v) !== -1 || depth === maxDepth) return | 
|     seen.push(v) | 
|     soFar += '{' | 
|     Object.keys(v).forEach(function (k, _, __) { | 
|       // pseudo-private values.  skip those. | 
|       if (k.charAt(0) === '_') return | 
|       var to = typeof v[k] | 
|       if (to === 'function' || to === 'undefined') return | 
|       soFar += k + ':' | 
|       ch(v[k], depth + 1) | 
|     }) | 
|     soFar += '}' | 
|   } | 
|   ch(obj, 0) | 
|   return soFar | 
| } | 
|   | 
| function sparseFE (obj, maxDepth) { | 
|   var seen = [] | 
|   var soFar = '' | 
|   function ch (v, depth) { | 
|     if (depth > maxDepth) return | 
|     if (typeof v === 'function' || typeof v === 'undefined') return | 
|     if (typeof v !== 'object' || !v) { | 
|       soFar += v | 
|       return | 
|     } | 
|     if (seen.indexOf(v) !== -1 || depth === maxDepth) return | 
|     seen.push(v) | 
|     soFar += '{' | 
|     Object.keys(v).forEach(function (k, _, __) { | 
|       // pseudo-private values.  skip those. | 
|       if (k.charAt(0) === '_') return | 
|       var to = typeof v[k] | 
|       if (to === 'function' || to === 'undefined') return | 
|       soFar += k | 
|       ch(v[k], depth + 1) | 
|     }) | 
|   } | 
|   ch(obj, 0) | 
|   return soFar | 
| } | 
|   | 
| function sparse (obj, maxDepth) { | 
|   var seen = [] | 
|   var soFar = '' | 
|   function ch (v, depth) { | 
|     if (depth > maxDepth) return | 
|     if (typeof v === 'function' || typeof v === 'undefined') return | 
|     if (typeof v !== 'object' || !v) { | 
|       soFar += v | 
|       return | 
|     } | 
|     if (seen.indexOf(v) !== -1 || depth === maxDepth) return | 
|     seen.push(v) | 
|     soFar += '{' | 
|     for (var k in v) { | 
|       // pseudo-private values.  skip those. | 
|       if (k.charAt(0) === '_') continue | 
|       var to = typeof v[k] | 
|       if (to === 'function' || to === 'undefined') continue | 
|       soFar += k | 
|       ch(v[k], depth + 1) | 
|     } | 
|   } | 
|   ch(obj, 0) | 
|   return soFar | 
| } | 
|   | 
| function noCommas (obj, maxDepth) { | 
|   var seen = [] | 
|   var soFar = '' | 
|   function ch (v, depth) { | 
|     if (depth > maxDepth) return | 
|     if (typeof v === 'function' || typeof v === 'undefined') return | 
|     if (typeof v !== 'object' || !v) { | 
|       soFar += v | 
|       return | 
|     } | 
|     if (seen.indexOf(v) !== -1 || depth === maxDepth) return | 
|     seen.push(v) | 
|     soFar += '{' | 
|     for (var k in v) { | 
|       // pseudo-private values.  skip those. | 
|       if (k.charAt(0) === '_') continue | 
|       var to = typeof v[k] | 
|       if (to === 'function' || to === 'undefined') continue | 
|       soFar += k + ':' | 
|       ch(v[k], depth + 1) | 
|     } | 
|     soFar += '}' | 
|   } | 
|   ch(obj, 0) | 
|   return soFar | 
| } | 
|   | 
|   | 
| function flatten (obj, maxDepth) { | 
|   var seen = [] | 
|   var soFar = '' | 
|   function ch (v, depth) { | 
|     if (depth > maxDepth) return | 
|     if (typeof v === 'function' || typeof v === 'undefined') return | 
|     if (typeof v !== 'object' || !v) { | 
|       soFar += v | 
|       return | 
|     } | 
|     if (seen.indexOf(v) !== -1 || depth === maxDepth) return | 
|     seen.push(v) | 
|     soFar += '{' | 
|     for (var k in v) { | 
|       // pseudo-private values.  skip those. | 
|       if (k.charAt(0) === '_') continue | 
|       var to = typeof v[k] | 
|       if (to === 'function' || to === 'undefined') continue | 
|       soFar += k + ':' | 
|       ch(v[k], depth + 1) | 
|       soFar += ',' | 
|     } | 
|     soFar += '}' | 
|   } | 
|   ch(obj, 0) | 
|   return soFar | 
| } | 
|   | 
| exports.compare = | 
| { | 
|   // 'custom 2': function () { | 
|   //   return custom(test, 2, 0) | 
|   // }, | 
|   // 'customWs 2': function () { | 
|   //   return customWs(test, 2, 0) | 
|   // }, | 
|   'JSON.stringify (guarded)': function () { | 
|     var seen = [] | 
|     return JSON.stringify(test, function (k, v) { | 
|       if (typeof v !== 'object' || !v) return v | 
|       if (seen.indexOf(v) !== -1) return undefined | 
|       seen.push(v) | 
|       return v | 
|     }) | 
|   }, | 
|   | 
|   'flatten 10': function () { | 
|     return flatten(test, 10) | 
|   }, | 
|   | 
|   // 'flattenFE 10': function () { | 
|   //   return flattenFE(test, 10) | 
|   // }, | 
|   | 
|   'noCommas 10': function () { | 
|     return noCommas(test, 10) | 
|   }, | 
|   | 
|   'sparse 10': function () { | 
|     return sparse(test, 10) | 
|   }, | 
|   | 
|   'sparseFE 10': function () { | 
|     return sparseFE(test, 10) | 
|   }, | 
|   | 
|   'sparseFE2 10': function () { | 
|     return sparseFE2(test, 10) | 
|   }, | 
|   | 
|   sigmund: function() { | 
|     return sigmund(test, 10) | 
|   }, | 
|   | 
|   | 
|   // 'util.inspect 1': function () { | 
|   //   return util.inspect(test, false, 1, false) | 
|   // }, | 
|   // 'util.inspect undefined': function () { | 
|   //   util.inspect(test) | 
|   // }, | 
|   // 'util.inspect 2': function () { | 
|   //   util.inspect(test, false, 2, false) | 
|   // }, | 
|   // 'util.inspect 3': function () { | 
|   //   util.inspect(test, false, 3, false) | 
|   // }, | 
|   // 'util.inspect 4': function () { | 
|   //   util.inspect(test, false, 4, false) | 
|   // }, | 
|   // 'util.inspect Infinity': function () { | 
|   //   util.inspect(test, false, Infinity, false) | 
|   // } | 
| } | 
|   | 
| /** results | 
| **/ |