diff --git a/deps.js b/deps.js new file mode 100644 index 0000000..23b7393 --- /dev/null +++ b/deps.js @@ -0,0 +1,6 @@ +// @ts-nocheck +// Exported library has no type defs which makes TS unhappy. To workaround this +// we define `deps.ts` and ignore this file. That way TS picks types and provides +// inference. +import mur from 'murmurhash3js-revisited' +export { mur } diff --git a/deps.ts b/deps.ts new file mode 100644 index 0000000..ea0bb01 --- /dev/null +++ b/deps.ts @@ -0,0 +1,10 @@ +interface Mur { + x86: { + hash32(input:Uint8Array): number + } + x64: { + hash128(input:Uint8Array): string + } +} + +export var mur:Mur diff --git a/index.js b/index.js index 418b1df..38f771a 100644 --- a/index.js +++ b/index.js @@ -1,29 +1,9 @@ -import { from } from 'multiformats/hashes/hasher' -import { bytes } from 'multiformats' -// @ts-ignore -import mur from 'murmurhash3js-revisited' -/** - * @param {number} number - * @returns {Uint8Array} - */ -function fromNumberTo32BitBuf (number) { - const bytes = new Array(4) - for (let i = 0; i < 4; i++) { - bytes[i] = number & 0xff - number = number >> 8 - } - return new Uint8Array(bytes) -} +import * as mur32 from './murmur32.js' +import * as mur128 from './murmur128.js' -export const murmur332 = from({ - name: 'murmur3-32', - code: 0x23, - encode: (input) => fromNumberTo32BitBuf(mur.x86.hash32(input)) -}) +/** @type {import('multiformats/hashes/interface').SyncMultihashHasher<0x23>} */ +export const murmur332 = mur32 -export const murmur3128 = from({ - name: 'murmur3-128', - code: 0x22, - encode: (input) => bytes.fromHex(mur.x64.hash128(input)) -}) +/** @type {import('multiformats/hashes/interface').SyncMultihashHasher<0x22>} */ +export const murmur3128 = mur128 diff --git a/murmur128.js b/murmur128.js new file mode 100644 index 0000000..d91dc88 --- /dev/null +++ b/murmur128.js @@ -0,0 +1,21 @@ +import { mur } from './deps.js' +import { bytes } from 'multiformats' +import * as Digest from 'multiformats/hashes/digest' + +export const name = 'murmur3-128' +export const code = 0x22 + +/** + * @param {Uint8Array} input + * @returns {import('multiformats/hashes/interface').MultihashDigest} + */ +export const digest = (input) => { + return Digest.create(code, encode(input)) +} + +/** + * @param {Uint8Array} input + */ +export const encode = (input) => { + return bytes.fromHex(mur.x64.hash128(input)) +} diff --git a/murmur32.js b/murmur32.js new file mode 100644 index 0000000..d78f4c5 --- /dev/null +++ b/murmur32.js @@ -0,0 +1,31 @@ +import { mur } from './deps.js' +import * as Digest from 'multiformats/hashes/digest' + +export const name = 'murmur3-32' +export const code = 0x23 + +/** + * @param {Uint8Array} input + * @returns {import('multiformats/hashes/interface').MultihashDigest} + */ +export const digest = (input) => { + return Digest.create(code, encode(input)) +} + +/** + * @param {Uint8Array} input + */ +export const encode = (input) => fromNumberTo32BitBuf(mur.x86.hash32(input)) + +/** + * @param {number} number + * @returns {Uint8Array} + */ +const fromNumberTo32BitBuf = (number) => { + const bytes = new Array(4) + for (let i = 0; i < 4; i++) { + bytes[i] = number & 0xff + number = number >> 8 + } + return new Uint8Array(bytes) +} diff --git a/package.json b/package.json index 95be30e..d44ff8c 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,18 @@ "author": "Mikeal Rogers (https://www.mikealrogers.com/)", "license": "(Apache-2.0 AND MIT)", "exports": { - "import": "./index.js" + ".": { + "import": "./index.js" + }, + "./murmur32": { + "import": "./murmur32.js" + }, + "./murmur128": { + "import": "./murmur128.js" + } }, "dependencies": { - "multiformats": "^9.5.4", + "multiformats": "^9.6.0", "murmurhash3js-revisited": "^3.0.0" }, "devDependencies": {