| /** | |
| * 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); | |
| } | |