File size: 2,066 Bytes
bc20498 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
export const DEFAULT_HASH_SEED = 9261;
const K = 65599; // 37 also works pretty well
export const DEFAULT_HASH_SEED_ALT = 5381;
export const hashIterableInts = function( iterator, seed = DEFAULT_HASH_SEED ){ // sdbm/string-hash
let hash = seed;
let entry;
for( ;; ){
entry = iterator.next();
if( entry.done ){ break; }
hash = ((hash * K) + entry.value) | 0;
}
return hash;
};
export const hashInt = function( num, seed = DEFAULT_HASH_SEED ){ // sdbm/string-hash
return ((seed * K) + num) | 0;
};
export const hashIntAlt = function( num, seed = DEFAULT_HASH_SEED_ALT ){ // djb2/string-hash
return ((seed << 5) + seed + num) | 0;
};
export const combineHashes = function(hash1, hash2){
return hash1 * 0x200000 + hash2;
};
export const combineHashesArray = function(hashes){
return hashes[0] * 0x200000 + hashes[1];
};
export const hashArrays = function(hashes1, hashes2){
return [
hashInt(hashes1[0], hashes2[0]),
hashIntAlt(hashes1[1], hashes2[1])
];
};
export const hashIntsArray = function( ints, seed ){
let entry = { value: 0, done: false };
let i = 0;
let length = ints.length;
let iterator = {
next(){
if( i < length ){
entry.value = ints[i++];
} else {
entry.done = true;
}
return entry;
}
};
return hashIterableInts( iterator, seed );
};
export const hashString = function( str, seed ){
let entry = { value: 0, done: false };
let i = 0;
let length = str.length;
let iterator = {
next(){
if( i < length ){
entry.value = str.charCodeAt(i++);
} else {
entry.done = true;
}
return entry;
}
};
return hashIterableInts( iterator, seed );
};
export const hashStrings = function(){
return hashStringsArray( arguments );
};
export const hashStringsArray = function( strs ){
let hash;
for( let i = 0; i < strs.length; i++ ){
let str = strs[i];
if( i === 0 ){
hash = hashString( str );
} else {
hash = hashString( str, hash );
}
}
return hash;
};
|