reign
Version:
A persistent, typed-objects implementation.
101 lines (85 loc) • 2.48 kB
JavaScript
;
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;
}