/** | |
* Hash using djb2 | |
* @param {import('types').StrictBody[]} values | |
*/ | |
export function hash(...values) { | |
let hash = 5381; | |
for (const value of values) { | |
if (typeof value === 'string') { | |
let i = value.length; | |
while (i) hash = (hash * 33) ^ value.charCodeAt(--i); | |
} else if (ArrayBuffer.isView(value)) { | |
const buffer = new Uint8Array(value.buffer, value.byteOffset, value.byteLength); | |
let i = buffer.length; | |
while (i) hash = (hash * 33) ^ buffer[--i]; | |
} else { | |
throw new TypeError('value must be a string or TypedArray'); | |
} | |
} | |
return (hash >>> 0).toString(36); | |
} | |