code: function hashKey(obj) {
      var objType = typeof obj,
          key;
  
      if (objType == 'function' || (objType == 'object' && obj !== null)) {
          if (typeof (key = obj.$$hashKey) == 'function') {
              // must invoke on object to keep the right this
              key = obj.$$hashKey();
          } else if (key === undefined) {
              key = obj.$$hashKey = nextUid();
          }
      } else {
          key = obj;
      }
  
      return objType + ':' + key;
  }
docs: Computes a hash of an 'obj'.
  Hash of a:
  string is string
  number is number as string
  object is either result of calling $$hashKey function on the object or uniquely generated id,
  that is also assigned to the $$hashKey property of the object.
  
  @param obj
  @returns {string} hash string such that the same input will have the same hash string.
  The resulting string key is in 'type:hashKey' format.