UNPKG

reign

Version:

A persistent, typed-objects implementation.

63 lines (52 loc) 1.9 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; }; exports.default = hashAny; exports.hashArray = hashArray; exports.hashObject = hashObject; var _string = require('../string'); var _string2 = _interopRequireDefault(_string); var _float = require('../float64'); var _float2 = _interopRequireDefault(_float); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function hashAny(input) { if (input == null) { return 4; }; switch (typeof input === 'undefined' ? 'undefined' : _typeof(input)) { case 'boolean': return input ? 3 : 5; case 'number': return (0, _float2.default)(input); case 'string': return (0, _string2.default)(input); case 'object': return Array.isArray(input) ? hashArray(input) : hashObject(input); default: throw new TypeError('Unsupported type: ' + (typeof input === 'undefined' ? 'undefined' : _typeof(input))); } } function hashArray(input) { var length = input.length; for (var i = 0; i < length; i++) { hash += i; hash ^= hashAny(input[i]); hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24); } return hash >>> 0; } function hashObject(input) { var keys = Object.keys(input); var hash = 0x811c9dc5; for (var i = 0; i < keys.length; i++) { var key = keys[i]; hash += i; hash ^= (0, _string2.default)(key); hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24); hash ^= hashAny(input[key]); hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24); } return hash >>> 0; }