From fe66be326dff9dd28d83a3f95202584b7b58f800 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Thu, 27 Jan 2022 16:46:59 +0000 Subject: [PATCH 1/3] feat!: implement sync multihash hasher and export encode methods (#17) (#18) - encode method in main module is gone, but still available when importing specic implementation e.g. '@multiformats/murmur3/murmur128' --- deps.js | 3 +++ deps.ts | 10 ++++++++++ index.js | 32 ++++++-------------------------- murmur128.js | 21 +++++++++++++++++++++ murmur32.js | 31 +++++++++++++++++++++++++++++++ package.json | 12 ++++++++++-- 6 files changed, 81 insertions(+), 28 deletions(-) create mode 100644 deps.js create mode 100644 deps.ts create mode 100644 murmur128.js create mode 100644 murmur32.js diff --git a/deps.js b/deps.js new file mode 100644 index 0000000..9384168 --- /dev/null +++ b/deps.js @@ -0,0 +1,3 @@ +// @ts-nocheck - this will be overlayed +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..e0e1d88 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.js": { + "import": "./murmur32.js" + }, + "./murmur128.js": { + "import": "./murmur128.js" + } }, "dependencies": { - "multiformats": "^9.5.4", + "multiformats": "^9.6.0", "murmurhash3js-revisited": "^3.0.0" }, "devDependencies": { From 9d6e7aa290f80ed0ee915fa78852eb8eb40a7bf4 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Thu, 3 Feb 2022 15:13:54 -0800 Subject: [PATCH 2/3] chore: drop .js extensions --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e0e1d88..d44ff8c 100644 --- a/package.json +++ b/package.json @@ -34,10 +34,10 @@ ".": { "import": "./index.js" }, - "./murmur32.js": { + "./murmur32": { "import": "./murmur32.js" }, - "./murmur128.js": { + "./murmur128": { "import": "./murmur128.js" } }, From d81d7ff3eb32e1a0aabc92982f9d9a0ee3d76222 Mon Sep 17 00:00:00 2001 From: Irakli Gozalishvili Date: Thu, 3 Feb 2022 15:17:25 -0800 Subject: [PATCH 3/3] chore: elaborate on ts-nocheck --- deps.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/deps.js b/deps.js index 9384168..23b7393 100644 --- a/deps.js +++ b/deps.js @@ -1,3 +1,6 @@ -// @ts-nocheck - this will be overlayed +// @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 }