UNPKG

reign

Version:

A persistent, typed-objects implementation.

101 lines (85 loc) 2.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = hashString; exports.fnv = fnv; exports.djb = djb; exports.murmur3 = murmur3; /** * Hash a string and return the value. */ function hashString(input) { var hash = 0; var length = input.length; for (var i = 0; i < length; i++) { hash = (hash << 5) - hash + input.charCodeAt(i); } return hash >>> 0; } /** * Calculate a 32 bit FNV-1a hash */ function fnv(input) { var hash = 0x811c9dc5; for (var i = 0; i < input.length; i++) { hash ^= input.charCodeAt(i); hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24); } return hash >>> 0; } /** * Calculate a 32 bit DJB hash. */ function djb(input) { var hash = 5381; for (var i = 0; i < input.length; i++) { hash = (hash << 5) + hash + input.charCodeAt(i); } return hash >>> 0; } /** * Calculate a 32 bit Murmur3 hash. */ function murmur3(key) { var h1b = void 0, k1 = void 0; var seed = 0; var remainder = key.length & 3; // key.length % 4 var bytes = key.length - remainder; var h1 = seed; var c1 = 0xcc9e2d51; var c2 = 0x1b873593; var i = 0; while (i < bytes) { k1 = key.charCodeAt(i) & 0xff | (key.charCodeAt(++i) & 0xff) << 8 | (key.charCodeAt(++i) & 0xff) << 16 | (key.charCodeAt(++i) & 0xff) << 24; ++i; k1 = (k1 & 0xffff) * c1 + (((k1 >>> 16) * c1 & 0xffff) << 16) & 0xffffffff; k1 = k1 << 15 | k1 >>> 17; k1 = (k1 & 0xffff) * c2 + (((k1 >>> 16) * c2 & 0xffff) << 16) & 0xffffffff; h1 ^= k1; h1 = h1 << 13 | h1 >>> 19; h1b = (h1 & 0xffff) * 5 + (((h1 >>> 16) * 5 & 0xffff) << 16) & 0xffffffff; h1 = (h1b & 0xffff) + 0x6b64 + (((h1b >>> 16) + 0xe654 & 0xffff) << 16); } k1 = 0; switch (remainder) { case 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; case 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; case 1: k1 ^= key.charCodeAt(i) & 0xff; k1 = (k1 & 0xffff) * c1 + (((k1 >>> 16) * c1 & 0xffff) << 16) & 0xffffffff; k1 = k1 << 15 | k1 >>> 17; k1 = (k1 & 0xffff) * c2 + (((k1 >>> 16) * c2 & 0xffff) << 16) & 0xffffffff; h1 ^= k1; } h1 ^= key.length; h1 ^= h1 >>> 16; h1 = (h1 & 0xffff) * 0x85ebca6b + (((h1 >>> 16) * 0x85ebca6b & 0xffff) << 16) & 0xffffffff; h1 ^= h1 >>> 13; h1 = (h1 & 0xffff) * 0xc2b2ae35 + (((h1 >>> 16) * 0xc2b2ae35 & 0xffff) << 16) & 0xffffffff; h1 ^= h1 >>> 16; return h1 >>> 0; }