echogarden
Version:
An easy-to-use speech toolset. Includes tools for synthesis, recognition, alignment, speech translation, language detection, source separation and more.
78 lines (51 loc) • 1.39 kB
text/typescript
export function murmurHash3(bytes: Uint8Array, seed = 0) {
// https://github.com/bryc/code/blob/master/jshash/hashes/murmurhash3.js
const p1 = 3432918353
const p2 = 461845907
const p3 = 2246822507
const p4 = 3266489909
const byteCount = bytes.length
const intIterationMaxIndex = byteCount & -4
let k = 0
let hash = seed | 0
let i = 0
for (; i < intIterationMaxIndex; i += 4) {
k = bytes[i + 3] << 24 | bytes[i + 2] << 16 | bytes[i + 1] << 8 | bytes[i]
k = Math.imul(k, p1)
k = k << 15 | k >>> 17
hash ^= Math.imul(k, p2)
hash = hash << 13 | hash >>> 19
hash = (Math.imul(hash, 5) + 3864292196) | 0 // |0 = prevent float
}
k = 0
switch (bytes.length & 3) {
case 3: {
k ^= bytes[i + 2] << 16
}
case 2: {
k ^= bytes[i + 1] << 8
}
case 1: {
k ^= bytes[i]
k = Math.imul(k, p1)
k = k << 15 | k >>> 17
hash ^= Math.imul(k, p2)
}
}
hash ^= byteCount
hash ^= hash >>> 16
hash = Math.imul(hash, p3)
hash ^= hash >>> 13
hash = Math.imul(hash, p4)
hash ^= hash >>> 16
return hash >>> 0
}
export function convertToSingleInt32Hash(hash: (bytes: Uint8Array) => number) {
const bytes = new Uint8Array(4)
const ints = new Int32Array(bytes.buffer)
return (int32Val: number): number => {
ints[0] = int32Val
return hash(bytes)
}
}
export const murmurHash3_int32Input = convertToSingleInt32Hash(murmurHash3)