min-mphash 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +14 -1
- package/README.md +15 -2
- package/README.zh.md +14 -1
- package/dist/MinMPLookup.d.ts +2 -2
- package/dist/index.js +5 -5
- package/dist/index.min.js +1 -1
- package/dist/runtime.js +4 -4
- package/dist/runtime.min.js +1 -1
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[中文 README](./README.zh.md)
|
|
6
6
|
|
|
7
|
-
`MinMPHash` can map a set of n strings to the integer range `[0, n-1]` without any collisions.
|
|
7
|
+
`MinMPHash` can map a set of n strings to the integer range `[0, n-1]` without any collisions. If only the hash function is used, the package size is less than 3KB (Gzip).
|
|
8
8
|
|
|
9
9
|
`MinMPLookup` is a minimal perfect lookup table tool implemented based on `MinMPHash`.
|
|
10
10
|
|
|
@@ -121,6 +121,19 @@ You might think that hash functions like MD5 or SHA-1 can also generate identifi
|
|
|
121
121
|
npm install min-mphash
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
+
This package only provides ESM, and using build tools can effectively perform tree-shaking to reduce the size.
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
// hash build & hush function
|
|
128
|
+
min-mphash/index.js 34.7 kB
|
|
129
|
+
min-mphash/index.min.js 14.6 kB 4.9 kB(Gzip)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
// hush function only
|
|
133
|
+
min-mphash/runtime.js 18.3 kB
|
|
134
|
+
min-mphash/runtime.min.js 7.9 kB 2.8 kB(Gzip)
|
|
135
|
+
```
|
|
136
|
+
|
|
124
137
|
### MinMPHash Usage
|
|
125
138
|
|
|
126
139
|
This is the core function, used to map a set of strings to integers in `[0, n-1]`.
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
[中文 README](./README.zh.md)
|
|
8
8
|
|
|
9
|
-
TypeScript/JavaScript
|
|
9
|
+
TypeScript/JavaScript 平台上的最小完美哈希与查找工具实现。如果只使用哈希函数包体积小于 3KB(Gzip)。
|
|
10
10
|
|
|
11
11
|
`MinMPHash` 可以把一组数量为 n 的字符串映射到 `[0, n-1]` 的整数范围内,且不会有冲突。
|
|
12
12
|
|
|
@@ -18,7 +18,7 @@ TypeScript/JavaScript 平台上的最小完美哈希与查找工具实现。
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
-
`MinMPHash` can map a set of n strings to the integer range `[0, n-1]` without any collisions.
|
|
21
|
+
`MinMPHash` can map a set of n strings to the integer range `[0, n-1]` without any collisions. If only the hash function is used, the package size is less than 3KB (Gzip).
|
|
22
22
|
|
|
23
23
|
`MinMPLookup` is a minimal perfect lookup table tool implemented based on `MinMPHash`.
|
|
24
24
|
|
|
@@ -135,6 +135,19 @@ You might think that hash functions like MD5 or SHA-1 can also generate identifi
|
|
|
135
135
|
npm install min-mphash
|
|
136
136
|
```
|
|
137
137
|
|
|
138
|
+
This package only provides ESM, and using build tools can effectively perform tree-shaking to reduce the size.
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
// hash build & hush function
|
|
142
|
+
min-mphash/index.js 34.7 kB
|
|
143
|
+
min-mphash/index.min.js 14.6 kB 4.9 kB(Gzip)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
// hush function only
|
|
147
|
+
min-mphash/runtime.js 18.3 kB
|
|
148
|
+
min-mphash/runtime.min.js 7.9 kB 2.8 kB(Gzip)
|
|
149
|
+
```
|
|
150
|
+
|
|
138
151
|
### MinMPHash Usage
|
|
139
152
|
|
|
140
153
|
This is the core function, used to map a set of strings to integers in `[0, n-1]`.
|
package/README.zh.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[English README](./README.en.md)
|
|
6
6
|
|
|
7
|
-
TypeScript/JavaScript
|
|
7
|
+
TypeScript/JavaScript 平台上的最小完美哈希与查找工具实现。如果只使用哈希函数包体积小于 3KB(Gzip)。
|
|
8
8
|
|
|
9
9
|
`MinMPHash` 可以把一组数量为 n 的字符串映射到 `[0, n-1]` 的整数范围内,且不会有冲突。
|
|
10
10
|
|
|
@@ -123,6 +123,19 @@ let found = Object.entries(FontMapWithHash).find(([family, hashes]) =>
|
|
|
123
123
|
npm install min-mphash
|
|
124
124
|
```
|
|
125
125
|
|
|
126
|
+
此包仅提供 ESM,使用构建工具可以很的进行 tree-shaking 以减小体积。
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
// hash build & hush function
|
|
130
|
+
min-mphash/index.js 34.7 kB
|
|
131
|
+
min-mphash/index.min.js 14.6 kB 4.9 kB(Gzip)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
// hush function only
|
|
135
|
+
min-mphash/runtime.js 18.3 kB
|
|
136
|
+
min-mphash/runtime.min.js 7.9 kB 2.8 kB(Gzip)
|
|
137
|
+
```
|
|
138
|
+
|
|
126
139
|
### MinMPHash 最小完美哈希的使用
|
|
127
140
|
|
|
128
141
|
这是最核心的功能,用于将一组字符串映射到 `[0, n-1]` 的整数。
|
package/dist/MinMPLookup.d.ts
CHANGED
|
@@ -93,12 +93,12 @@ export declare function serializeMinMPLookupDict(dict: IMinMPLookupDict): Uint8A
|
|
|
93
93
|
*```
|
|
94
94
|
*/
|
|
95
95
|
export declare class MinMPLookup {
|
|
96
|
-
private dict;
|
|
97
96
|
private mph;
|
|
97
|
+
private dict;
|
|
98
98
|
private _invertedIndex;
|
|
99
99
|
static fromCompressed(data: Uint8Array): Promise<MinMPLookup>;
|
|
100
100
|
static fromBinary(data: Uint8Array): MinMPLookup;
|
|
101
|
-
constructor(dict: IMinMPLookupDict);
|
|
101
|
+
constructor(dict: IMinMPLookupDict | Uint8Array);
|
|
102
102
|
private buildInvertedIndex;
|
|
103
103
|
/**
|
|
104
104
|
* 查找 value 对应的第一个 key
|
package/dist/index.js
CHANGED
|
@@ -693,7 +693,7 @@ function serializeMinMPLookupDict(dict) {
|
|
|
693
693
|
parts.push(keyBytes);
|
|
694
694
|
}
|
|
695
695
|
if (dict.valueToKeyIndexes && void 0 !== dict.bitsPerKey) {
|
|
696
|
-
parts.push(writeU32(
|
|
696
|
+
parts.push(writeU32(0xffffffff));
|
|
697
697
|
parts.push(writeU32(dict.bitsPerKey));
|
|
698
698
|
parts.push(writeU32(dict.valueToKeyIndexes.length));
|
|
699
699
|
parts.push(dict.valueToKeyIndexes);
|
|
@@ -775,7 +775,7 @@ function deserializeLookupDict(data) {
|
|
|
775
775
|
keys.push(decoder.decode(kBytes));
|
|
776
776
|
}
|
|
777
777
|
const sectionLen = readU32();
|
|
778
|
-
if (
|
|
778
|
+
if (0xffffffff === sectionLen) {
|
|
779
779
|
const bitsPerKey = readU32();
|
|
780
780
|
const dataLen = readU32();
|
|
781
781
|
const valueToKeyIndexes = data.subarray(offset, offset + dataLen);
|
|
@@ -925,11 +925,11 @@ class MinMPLookup {
|
|
|
925
925
|
return this.dict.keys;
|
|
926
926
|
}
|
|
927
927
|
constructor(dict){
|
|
928
|
-
MinMPLookup_define_property(this, "dict", void 0);
|
|
929
928
|
MinMPLookup_define_property(this, "mph", void 0);
|
|
930
|
-
MinMPLookup_define_property(this, "
|
|
929
|
+
MinMPLookup_define_property(this, "dict", void 0);
|
|
930
|
+
MinMPLookup_define_property(this, "_invertedIndex", null);
|
|
931
|
+
if (dict instanceof Uint8Array) dict = deserializeLookupDict(dict);
|
|
931
932
|
this.dict = dict;
|
|
932
|
-
this._invertedIndex = null;
|
|
933
933
|
this.mph = new MinMPHash(dict.mmpHashDictBin);
|
|
934
934
|
if (dict.keyToHashes) this.buildInvertedIndex();
|
|
935
935
|
}
|
package/dist/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t,i){let n=0;for(;e>=128;){let r=127&e|128;Array.isArray(t)?t.push(r):void 0!==i&&(t[i+n]=r),e>>>=7,n++}return Array.isArray(t)?t.push(e):void 0!==i&&(t[i+n]=e),n+1}function i(e,t){let i=0,n=0,r=0;for(;;){let s=e[t+r];if(i|=(127&s)<<n,r++,(128&s)==0)break;n+=7}return{value:i,bytes:r}}let n={encodeInt(e,t){e<24?t.push(0|e):e<=255?t.push(24,e):e<=65535?t.push(25,e>>8,255&e):t.push(26,e>>>24&255,e>>>16&255,e>>>8&255,255&e)},encodeBytes(e,t){let i=e.byteLength;i<24?t.push(64|i):i<=255?t.push(88,i):i<=65535?t.push(89,i>>8,255&i):t.push(90,i>>>24&255,i>>>16&255,i>>>8&255,255&i);for(let n=0;n<i;n++)t.push(e[n])},encodeNull(e){e.push(246)},encodeArrayHead(e,t){e<24&&t.push(128|e)},decode(e,t){let i=e.getUint8(t.current++),r=224&i,s=31&i,l=0;if(s<24)l=s;else if(24===s)l=e.getUint8(t.current),t.current+=1;else if(25===s)l=e.getUint16(t.current,!1),t.current+=2;else if(26===s)l=e.getUint32(t.current,!1),t.current+=4;else throw Error("Unsupported CBOR size");if(0===r)return l;if(64===r){let i=l,n=new Uint8Array(e.buffer.slice(e.byteOffset+t.current,e.byteOffset+t.current+i));return t.current+=i,n}if(128===r){let i=l,r=[];for(let s=0;s<i;s++)r.push(n.decode(e,t));return r}if(246===i)return null;throw Error(`Unknown CBOR type: ${i.toString(16)}`)}},r={none:0,4:1,8:2,16:3,32:4,2:5},s=["none","4","8","16","32","2"];function l(e){let t=[];if(n.encodeArrayHead(9,t),n.encodeInt(e.n,t),n.encodeInt(e.m,t),n.encodeInt(e.seed0,t),n.encodeBytes(e.bucketSizes,t),n.encodeBytes(e.seedStream,t),n.encodeInt(r[e.validationMode],t),e.fingerprints&&"none"!==e.validationMode){let i;if(e.fingerprints instanceof Uint8Array)i=e.fingerprints;else if(e.fingerprints instanceof Uint16Array||e.fingerprints instanceof Uint32Array)i=new Uint8Array(e.fingerprints.buffer,e.fingerprints.byteOffset,e.fingerprints.byteLength);else{let t,n=e.validationMode;t="2"===n||"4"===n||"8"===n?new Uint8Array(e.fingerprints):"16"===n?new Uint16Array(e.fingerprints):new Uint32Array(e.fingerprints),i=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}n.encodeBytes(i,t)}else n.encodeNull(t);return e.seedZeroBitmap?n.encodeBytes(e.seedZeroBitmap,t):n.encodeNull(t),n.encodeInt(e.hashSeed||0,t),new Uint8Array(t)}async function o(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function f(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}class h{write(e,t){for(let i=0;i<t;i++){let t=e>>i&1;this.currentByte|=t<<this.bitCount,this.bitCount++,8===this.bitCount&&(this.buffer.push(this.currentByte),this.currentByte=0,this.bitCount=0)}}flush(){this.bitCount>0&&(this.buffer.push(this.currentByte),this.currentByte=0,this.bitCount=0)}getData(){return this.flush(),new Uint8Array(this.buffer)}constructor(){e(this,"buffer",[]),e(this,"currentByte",0),e(this,"bitCount",0)}}class a{read(e){let t=0;for(let i=0;i<e;i++){if(this.byteOffset>=this.buffer.length)return 0;t|=(this.buffer[this.byteOffset]>>this.bitOffset&1)<<i,this.bitOffset++,8===this.bitOffset&&(this.byteOffset++,this.bitOffset=0)}return t}constructor(t){e(this,"buffer",void 0),e(this,"byteOffset",0),e(this,"bitOffset",0),this.buffer=t}}function u(e,t,i){let n=0,r=t;for(let t=0;t<i;t++){let i=r>>>3,s=7&r;if(i>=e.length)return 0;n|=(e[i]>>s&1)<<t,r++}return n}function d(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function c(e,t){let i=e.length;if(0===i){let e={n:0,m:0,seed0:0,seedStream:new Uint8Array(0),bucketSizes:new Uint8Array(0),validationMode:"none"};return t?.outputBinary?l(e):e}let n=t?.level??5,r="none";t?.onlySet===!0?r="8":"string"==typeof t?.onlySet&&(r=t.onlySet);let s=i>5e5?Math.max(1,.9*n):n,f=Math.max(1,Math.ceil(i/s)),h=new Uint32Array(i),a=new Uint32Array(i),u=0;for(;;){let t=new Map,n=new Map,r=!1;for(let s=0;s<i;s++){let i=b(e[s],u),l=b(e[s],~u),o=!1;if(n.has(i)){let e=n.get(i);e.has(l)?o=!0:e.add(l)}else if(t.has(i)){let e=t.get(i);if(e===l)o=!0;else{let r=new Set;r.add(e),r.add(l),n.set(i,r),t.delete(i)}}else t.set(i,l);if(o){r=!0;break}h[s]=i,a[s]=l}if(!r)break;if(++u>100)throw Error(`Could not find a collision-free hash seed after ${u} attempts.`)}let d=new Int32Array(f).fill(-1),c=new Int32Array(i).fill(-1),g=0,m=1/0,M=new Int32Array(f),v=new Int32Array(i),A=new Int32Array(f);for(let e=0;e<2e3;e++){let t=Math.floor(0xffffffff*Math.random());M.fill(-1),A.fill(0);let n=0;for(let e=0;e<i;e++){let i=Math.floor(((p(h[e],t)^a[e])>>>0)/0x100000000*f);v[e]=M[i],M[i]=e,A[i]++,A[i]>n&&(n=A[i])}if(n<13){g=t,d.set(M),c.set(v),m=n;break}if(n<m&&(m=n,g=t,d.set(M),c.set(v)),m<16&&e>50)break}if(m>=16)throw Error(`MPHF Build Failed: Could not find a bucket distribution with max size < 16 (best: ${m}). Try reducing the optimization level (current: ${t?.level??5}).`);let U=new Uint8Array(Math.ceil(f/2));for(let e=0;e<f;e++){let t=0,i=d[e];for(;-1!==i;)t++,i=c[i];let n=e>>>1;(1&e)==0?U[n]|=t:U[n]|=t<<4}let x=new w,k=new Uint8Array(Math.ceil(f/8));for(let e=0;e<f;e++){let t=0,i=d[e];for(;-1!==i;)t++,i=c[i];if(t<=1){k[e>>>3]|=1<<(7&e);continue}let n=0,r=!1,s=t>14?5e7:5e6;for(;!r;){let i=0,l=!1,o=d[e];for(;-1!==o;){let e=((p(h[o],n)^a[o])>>>0)%t;if((i&1<<e)!=0){l=!0;break}i|=1<<e,o=c[o]}if(l){if(++n>s)throw Error(`MPHF Failed: Bucket ${e} (size ${t}) is too hard.`)}else 0===n?k[e>>>3]|=1<<(7&e):x.write(n),r=!0}}let B={n:i,m:f,seed0:g,hashSeed:u,seedStream:x.toUint8Array(),bucketSizes:U,seedZeroBitmap:k,validationMode:r};if("none"!==r){let t;t="2"===r?new Uint8Array(Math.ceil(i/4)):"4"===r?new Uint8Array(Math.ceil(i/2)):"8"===r?new Uint8Array(i):"16"===r?new Uint16Array(i):new Uint32Array(i);let n=new y({...B,validationMode:"none"});for(let s=0;s<i;s++){let l=e[s],o=n.hash(l);if(o>=0&&o<i){let e=b(l,0x1234abcd);if("2"===r){let i=3&e,n=o>>>2,r=(3&o)<<1;t[n]|=i<<r}else if("4"===r){let i=15&e,n=o>>>1;(1&o)==0?t[n]|=i:t[n]|=i<<4}else"8"===r?t[o]=255&e:"16"===r?t[o]=65535&e:t[o]=e>>>0}}B.fingerprints=t}if(t?.outputBinary){let e=l(B);return t.enableCompression?o(e):e}return B}class y{static async fromCompressed(e){return new y(await f(e))}hash(e){if(0===this.n)return -1;let t=b(e,this.hashSeed),i=b(e,~this.hashSeed),n=Math.floor(((p(t,this.seed0)^i)>>>0)/0x100000000*this.m),r=this.offsets[n],s=this.offsets[n+1]-r;if(0===s)return -1;let l=0;if(l=1===s?r:r+((p(t,this.seeds[n])^i)>>>0)%s,"none"!==this.validationMode&&this.fingerprints){let t=b(e,y.FP_SEED);if("2"===this.validationMode){let e=l>>>2,i=(3&l)<<1;if((this.fingerprints[e]>>>i&3)!=(3&t))return -1}else if("4"===this.validationMode){let e=l>>>1,i=this.fingerprints[e];if(((1&l)==0?15&i:i>>>4&15)!=(15&t))return -1}else if("8"===this.validationMode){if(this.fingerprints[l]!==(255&t))return -1}else if("16"===this.validationMode){if(this.fingerprints[l]!==(65535&t))return -1}else if(this.fingerprints[l]!==t>>>0)return -1}return l}constructor(e){if(d(this,"n",void 0),d(this,"m",void 0),d(this,"seed0",void 0),d(this,"hashSeed",void 0),d(this,"offsets",void 0),d(this,"seeds",void 0),d(this,"validationMode",void 0),d(this,"fingerprints",null),e instanceof Uint8Array&&(e=function(e){let t,i=new DataView(e.buffer,e.byteOffset,e.byteLength),r=n.decode(i,{current:0});if(!Array.isArray(r)||r.length<7)throw Error("Invalid CBOR format");let[l,o,f,h,a,u,d,c,y]=r,p=s[u]||"none";return d&&"none"!==p&&("2"===p||"4"===p||"8"===p?t=d:"16"===p?t=new Uint16Array(d.buffer,d.byteOffset,d.byteLength/2):"32"===p&&(t=new Uint32Array(d.buffer,d.byteOffset,d.byteLength/4))),{n:l,m:o,seed0:f,hashSeed:y||0,bucketSizes:h,seedStream:a,validationMode:p,fingerprints:t,seedZeroBitmap:c||void 0}}(e)),this.n=e.n,this.m=e.m,this.seed0=e.seed0,this.hashSeed=e.hashSeed||0,this.validationMode=e.validationMode||"none",0===this.n){this.offsets=new Uint32Array(0),this.seeds=new Int32Array(0);return}this.offsets=new Uint32Array(this.m+1);let t=0;for(let i=0;i<this.m;i++){this.offsets[i]=t;let n=e.bucketSizes[i>>>1];t+=1&i?n>>>4:15&n}this.offsets[this.m]=t,this.seeds=new Int32Array(this.m);let i=0,r=e.seedStream,l=e.seedZeroBitmap;for(let e=0;e<this.m;e++){let t=!1;if(l&&(l[e>>>3]&1<<(7&e))!=0&&(t=!0),t)this.seeds[e]=0;else{let t=0,n=0;for(;;){let e=r[i++];if(t|=(127&e)<<n,(128&e)==0)break;n+=7}this.seeds[e]=t}}if("none"!==this.validationMode&&e.fingerprints){let t=e.fingerprints;"2"===this.validationMode||"4"===this.validationMode||"8"===this.validationMode?this.fingerprints=t instanceof Uint8Array?t:new Uint8Array(t):"16"===this.validationMode?this.fingerprints=t instanceof Uint16Array?t:new Uint16Array(t):this.fingerprints=t instanceof Uint32Array?t:new Uint32Array(t)}}}function p(e,t){return e^=t,e=Math.imul(e,0x85ebca6b),e^=e>>>13,e=Math.imul(e,0xc2b2ae35),(e^=e>>>16)>>>0}function b(e,t){let i=t;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);i^=n=Math.imul(n=(n=Math.imul(n,0xcc9e2d51))<<15|n>>>17,0x1b873593),i=Math.imul(i=i<<13|i>>>19,5)+0xe6546b64}return i^=e.length,i^=i>>>16,i=Math.imul(i,0x85ebca6b),i^=i>>>13,i=Math.imul(i,0xc2b2ae35),(i^=i>>>16)>>>0}d(y,"FP_SEED",0x1234abcd);class w{write(e){for(;e>=128;)this.buffer.push(127&e|128),e>>>=7;this.buffer.push(e)}toUint8Array(){return new Uint8Array(this.buffer)}constructor(){d(this,"buffer",[])}}function g(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function m(e,i){let n,r=Object.keys(e),s=new Set;for(let t of r)for(let i of e[t])s.add(i);let l=Array.from(s),f=c(l,{level:i?.level,outputBinary:!0,onlySet:i?.onlySet??"8"}),a=new y(f),u=new Map;for(let t=0;t<r.length;t++)for(let i of e[r[t]])u.has(i)||u.set(i,[]),u.get(i).push(t);let d=0;for(let[e,t]of u)t.length>1&&d++;if(d<.1*l.length){let e=Math.ceil(Math.log2(r.length+1)),t=new h,i=new Map,s=new Int32Array(a.n).fill(-1);for(let[e,t]of u){let n=a.hash(e);n>=0&&(1===t.length?s[n]=t[0]:(s[n]=r.length,i.set(n,t)))}for(let i=0;i<a.n;i++){let n=s[i];t.write(n>=0?n:0,e)}n={mmpHashDictBin:f,keys:r,valueToKeyIndexes:t.getData(),bitsPerKey:e,collisionMap:i.size>0?i:void 0}}else{let t=[];for(let i of r){let n=e[i],r=[];for(let e of n){let t=a.hash(e);t>=0&&r.push(t)}r.sort((e,t)=>e-t),t.push(new Uint32Array(r))}n={mmpHashDictBin:f,keys:r,keyToHashes:t}}if(i?.outputBinary){let e=function(e){let i=[],n=new TextEncoder,r=e=>{let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!1),t};for(let t of(i.push(r(e.mmpHashDictBin.length)),i.push(e.mmpHashDictBin),i.push(r(e.keys.length)),e.keys)){let e=n.encode(t);i.push(r(e.length)),i.push(e)}if(e.valueToKeyIndexes&&void 0!==e.bitsPerKey)if(i.push(r(0xffffffff)),i.push(r(e.bitsPerKey)),i.push(r(e.valueToKeyIndexes.length)),i.push(e.valueToKeyIndexes),e.collisionMap&&e.collisionMap.size>0){let n=[];t(e.collisionMap.size,n);let s=Array.from(e.collisionMap.keys()).sort((e,t)=>e-t),l=0;for(let i of s){t(i-l,n),l=i;let r=e.collisionMap.get(i);t(r.length,n),r.sort((e,t)=>e-t);let s=0;for(let e of r)t(e-s,n),s=e}let o=new Uint8Array(n);i.push(r(o.length)),i.push(o)}else i.push(r(0));else if(e.keyToHashes){let n=[];for(let i of e.keyToHashes){if(t(i.length,n),0===i.length)continue;let e=0,r=0,s=[];for(let t=0;t<i.length;t++){let n=i[t],l=n-r;s.push(l),l>e&&(e=l),r=n}let l=0;e>0&&(l=Math.ceil(Math.log2(e+1))),n.push(l);let o=new h;for(let e of s)o.write(e,l);let f=o.getData();for(let e=0;e<f.length;e++)n.push(f[e])}let s=new Uint8Array(n);i.push(r(s.length)),i.push(s)}let s=new Uint8Array(i.reduce((e,t)=>e+t.length,0)),l=0;for(let e of i)s.set(e,l),l+=e.length;return s}(n);return i?.enableCompression?o(e):e}return i?.enableCompression?Promise.resolve(n):n}function M(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=0,r=new TextDecoder,s=()=>{let e=t.getUint32(n,!1);return n+=4,e},l=s(),o=e.subarray(n,n+l);n+=l;let f=s(),h=[];for(let t=0;t<f;t++){let t=s(),i=e.subarray(n,n+t);n+=t,h.push(r.decode(i))}let u=s();if(0xffffffff===u){let t,r=s(),l=s(),f=e.subarray(n,n+l);n+=l;let a=s();if(a>0){let r=e.subarray(n,n+a);n+=a,t=new Map;let s=0,{value:l,bytes:o}=i(r,0);s+=o;let f=0;for(let e=0;e<l;e++){let{value:e,bytes:n}=i(r,s);s+=n;let l=f+e;f=l;let{value:o,bytes:h}=i(r,s);s+=h;let a=[],u=0;for(let e=0;e<o;e++){let{value:e,bytes:t}=i(r,s);s+=t;let n=u+e;u=n,a.push(n)}t.set(l,a)}}return{mmpHashDictBin:o,keys:h,valueToKeyIndexes:f,bitsPerKey:r,collisionMap:t}}{let t=e.subarray(n,n+u);n+=u;let r=[],s=0;for(let e=0;e<f;e++){let{value:e,bytes:n}=i(t,s);if(s+=n,0===e){r.push(new Uint32Array(0));continue}let l=t[s];s+=1;let o=Math.ceil(l*e/8),f=t.subarray(s,s+o);s+=o;let h=new a(f),u=new Uint32Array(e),d=0;for(let t=0;t<e;t++)d+=h.read(l),u[t]=d;r.push(u)}return{mmpHashDictBin:o,keys:h,keyToHashes:r}}}class v{static async fromCompressed(e){return new v(M(await f(e)))}static fromBinary(e){return new v(M(e))}buildInvertedIndex(){if(!this.dict.keyToHashes)return;let e=this.mph.n;this._invertedIndex=Array.from({length:e},()=>[]);for(let t=0;t<this.dict.keys.length;t++){let i=this.dict.keyToHashes[t];for(let n=0;n<i.length;n++){let r=i[n];r<e&&this._invertedIndex[r].push(t)}}}query(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=u(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);if(i===this.dict.keys.length){if(this.dict.collisionMap&&this.dict.collisionMap.has(t)){let e=this.dict.collisionMap.get(t);return e.length>0?this.dict.keys[e[0]]:null}return null}return i>=this.dict.keys.length?null:this.dict.keys[i]}let t=this.queryAll(e);return t&&t.length>0?t[0]:null}queryAll(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=u(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);return i===this.dict.keys.length?this.dict.collisionMap&&this.dict.collisionMap.has(t)?this.dict.collisionMap.get(t).map(e=>this.dict.keys[e]):null:i>=this.dict.keys.length?null:[this.dict.keys[i]]}let t=this.mph.hash(e);if(t<0||!this._invertedIndex||t>=this._invertedIndex.length)return null;let i=this._invertedIndex[t];if(0===i.length)return null;let n=[];for(let e of i)n.push(this.dict.keys[e]);return n.length>0?n:null}keys(){return this.dict.keys}constructor(e){g(this,"dict",void 0),g(this,"mph",void 0),g(this,"_invertedIndex",void 0),this.dict=e,this._invertedIndex=null,this.mph=new y(e.mmpHashDictBin),e.keyToHashes&&this.buildInvertedIndex()}}export{y as MinMPHash,v as MinMPLookup,c as createMinMPHashDict,m as createMinMPLookupDict};
|
|
1
|
+
function e(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t,i){let n=0;for(;e>=128;){let r=127&e|128;Array.isArray(t)?t.push(r):void 0!==i&&(t[i+n]=r),e>>>=7,n++}return Array.isArray(t)?t.push(e):void 0!==i&&(t[i+n]=e),n+1}function i(e,t){let i=0,n=0,r=0;for(;;){let s=e[t+r];if(i|=(127&s)<<n,r++,(128&s)==0)break;n+=7}return{value:i,bytes:r}}let n={encodeInt(e,t){e<24?t.push(0|e):e<=255?t.push(24,e):e<=65535?t.push(25,e>>8,255&e):t.push(26,e>>>24&255,e>>>16&255,e>>>8&255,255&e)},encodeBytes(e,t){let i=e.byteLength;i<24?t.push(64|i):i<=255?t.push(88,i):i<=65535?t.push(89,i>>8,255&i):t.push(90,i>>>24&255,i>>>16&255,i>>>8&255,255&i);for(let n=0;n<i;n++)t.push(e[n])},encodeNull(e){e.push(246)},encodeArrayHead(e,t){e<24&&t.push(128|e)},decode(e,t){let i=e.getUint8(t.current++),r=224&i,s=31&i,l=0;if(s<24)l=s;else if(24===s)l=e.getUint8(t.current),t.current+=1;else if(25===s)l=e.getUint16(t.current,!1),t.current+=2;else if(26===s)l=e.getUint32(t.current,!1),t.current+=4;else throw Error("Unsupported CBOR size");if(0===r)return l;if(64===r){let i=l,n=new Uint8Array(e.buffer.slice(e.byteOffset+t.current,e.byteOffset+t.current+i));return t.current+=i,n}if(128===r){let i=l,r=[];for(let s=0;s<i;s++)r.push(n.decode(e,t));return r}if(246===i)return null;throw Error(`Unknown CBOR type: ${i.toString(16)}`)}},r={none:0,4:1,8:2,16:3,32:4,2:5},s=["none","4","8","16","32","2"];function l(e){let t=[];if(n.encodeArrayHead(9,t),n.encodeInt(e.n,t),n.encodeInt(e.m,t),n.encodeInt(e.seed0,t),n.encodeBytes(e.bucketSizes,t),n.encodeBytes(e.seedStream,t),n.encodeInt(r[e.validationMode],t),e.fingerprints&&"none"!==e.validationMode){let i;if(e.fingerprints instanceof Uint8Array)i=e.fingerprints;else if(e.fingerprints instanceof Uint16Array||e.fingerprints instanceof Uint32Array)i=new Uint8Array(e.fingerprints.buffer,e.fingerprints.byteOffset,e.fingerprints.byteLength);else{let t,n=e.validationMode;t="2"===n||"4"===n||"8"===n?new Uint8Array(e.fingerprints):"16"===n?new Uint16Array(e.fingerprints):new Uint32Array(e.fingerprints),i=new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}n.encodeBytes(i,t)}else n.encodeNull(t);return e.seedZeroBitmap?n.encodeBytes(e.seedZeroBitmap,t):n.encodeNull(t),n.encodeInt(e.hashSeed||0,t),new Uint8Array(t)}async function o(e){let t=new Blob([e]).stream().pipeThrough(new CompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}async function f(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}class h{write(e,t){for(let i=0;i<t;i++){let t=e>>i&1;this.currentByte|=t<<this.bitCount,this.bitCount++,8===this.bitCount&&(this.buffer.push(this.currentByte),this.currentByte=0,this.bitCount=0)}}flush(){this.bitCount>0&&(this.buffer.push(this.currentByte),this.currentByte=0,this.bitCount=0)}getData(){return this.flush(),new Uint8Array(this.buffer)}constructor(){e(this,"buffer",[]),e(this,"currentByte",0),e(this,"bitCount",0)}}class a{read(e){let t=0;for(let i=0;i<e;i++){if(this.byteOffset>=this.buffer.length)return 0;t|=(this.buffer[this.byteOffset]>>this.bitOffset&1)<<i,this.bitOffset++,8===this.bitOffset&&(this.byteOffset++,this.bitOffset=0)}return t}constructor(t){e(this,"buffer",void 0),e(this,"byteOffset",0),e(this,"bitOffset",0),this.buffer=t}}function u(e,t,i){let n=0,r=t;for(let t=0;t<i;t++){let i=r>>>3,s=7&r;if(i>=e.length)return 0;n|=(e[i]>>s&1)<<t,r++}return n}function d(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function c(e,t){let i=e.length;if(0===i){let e={n:0,m:0,seed0:0,seedStream:new Uint8Array(0),bucketSizes:new Uint8Array(0),validationMode:"none"};return t?.outputBinary?l(e):e}let n=t?.level??5,r="none";t?.onlySet===!0?r="8":"string"==typeof t?.onlySet&&(r=t.onlySet);let s=i>5e5?Math.max(1,.9*n):n,f=Math.max(1,Math.ceil(i/s)),h=new Uint32Array(i),a=new Uint32Array(i),u=0;for(;;){let t=new Map,n=new Map,r=!1;for(let s=0;s<i;s++){let i=b(e[s],u),l=b(e[s],~u),o=!1;if(n.has(i)){let e=n.get(i);e.has(l)?o=!0:e.add(l)}else if(t.has(i)){let e=t.get(i);if(e===l)o=!0;else{let r=new Set;r.add(e),r.add(l),n.set(i,r),t.delete(i)}}else t.set(i,l);if(o){r=!0;break}h[s]=i,a[s]=l}if(!r)break;if(++u>100)throw Error(`Could not find a collision-free hash seed after ${u} attempts.`)}let d=new Int32Array(f).fill(-1),c=new Int32Array(i).fill(-1),g=0,m=1/0,A=new Int32Array(f),M=new Int32Array(i),v=new Int32Array(f);for(let e=0;e<2e3;e++){let t=Math.floor(0xffffffff*Math.random());A.fill(-1),v.fill(0);let n=0;for(let e=0;e<i;e++){let i=Math.floor(((p(h[e],t)^a[e])>>>0)/0x100000000*f);M[e]=A[i],A[i]=e,v[i]++,v[i]>n&&(n=v[i])}if(n<13){g=t,d.set(A),c.set(M),m=n;break}if(n<m&&(m=n,g=t,d.set(A),c.set(M)),m<16&&e>50)break}if(m>=16)throw Error(`MPHF Build Failed: Could not find a bucket distribution with max size < 16 (best: ${m}). Try reducing the optimization level (current: ${t?.level??5}).`);let U=new Uint8Array(Math.ceil(f/2));for(let e=0;e<f;e++){let t=0,i=d[e];for(;-1!==i;)t++,i=c[i];let n=e>>>1;(1&e)==0?U[n]|=t:U[n]|=t<<4}let k=new w,x=new Uint8Array(Math.ceil(f/8));for(let e=0;e<f;e++){let t=0,i=d[e];for(;-1!==i;)t++,i=c[i];if(t<=1){x[e>>>3]|=1<<(7&e);continue}let n=0,r=!1,s=t>14?5e7:5e6;for(;!r;){let i=0,l=!1,o=d[e];for(;-1!==o;){let e=((p(h[o],n)^a[o])>>>0)%t;if((i&1<<e)!=0){l=!0;break}i|=1<<e,o=c[o]}if(l){if(++n>s)throw Error(`MPHF Failed: Bucket ${e} (size ${t}) is too hard.`)}else 0===n?x[e>>>3]|=1<<(7&e):k.write(n),r=!0}}let B={n:i,m:f,seed0:g,hashSeed:u,seedStream:k.toUint8Array(),bucketSizes:U,seedZeroBitmap:x,validationMode:r};if("none"!==r){let t;t="2"===r?new Uint8Array(Math.ceil(i/4)):"4"===r?new Uint8Array(Math.ceil(i/2)):"8"===r?new Uint8Array(i):"16"===r?new Uint16Array(i):new Uint32Array(i);let n=new y({...B,validationMode:"none"});for(let s=0;s<i;s++){let l=e[s],o=n.hash(l);if(o>=0&&o<i){let e=b(l,0x1234abcd);if("2"===r){let i=3&e,n=o>>>2,r=(3&o)<<1;t[n]|=i<<r}else if("4"===r){let i=15&e,n=o>>>1;(1&o)==0?t[n]|=i:t[n]|=i<<4}else"8"===r?t[o]=255&e:"16"===r?t[o]=65535&e:t[o]=e>>>0}}B.fingerprints=t}if(t?.outputBinary){let e=l(B);return t.enableCompression?o(e):e}return B}class y{static async fromCompressed(e){return new y(await f(e))}hash(e){if(0===this.n)return -1;let t=b(e,this.hashSeed),i=b(e,~this.hashSeed),n=Math.floor(((p(t,this.seed0)^i)>>>0)/0x100000000*this.m),r=this.offsets[n],s=this.offsets[n+1]-r;if(0===s)return -1;let l=0;if(l=1===s?r:r+((p(t,this.seeds[n])^i)>>>0)%s,"none"!==this.validationMode&&this.fingerprints){let t=b(e,y.FP_SEED);if("2"===this.validationMode){let e=l>>>2,i=(3&l)<<1;if((this.fingerprints[e]>>>i&3)!=(3&t))return -1}else if("4"===this.validationMode){let e=l>>>1,i=this.fingerprints[e];if(((1&l)==0?15&i:i>>>4&15)!=(15&t))return -1}else if("8"===this.validationMode){if(this.fingerprints[l]!==(255&t))return -1}else if("16"===this.validationMode){if(this.fingerprints[l]!==(65535&t))return -1}else if(this.fingerprints[l]!==t>>>0)return -1}return l}constructor(e){if(d(this,"n",void 0),d(this,"m",void 0),d(this,"seed0",void 0),d(this,"hashSeed",void 0),d(this,"offsets",void 0),d(this,"seeds",void 0),d(this,"validationMode",void 0),d(this,"fingerprints",null),e instanceof Uint8Array&&(e=function(e){let t,i=new DataView(e.buffer,e.byteOffset,e.byteLength),r=n.decode(i,{current:0});if(!Array.isArray(r)||r.length<7)throw Error("Invalid CBOR format");let[l,o,f,h,a,u,d,c,y]=r,p=s[u]||"none";return d&&"none"!==p&&("2"===p||"4"===p||"8"===p?t=d:"16"===p?t=new Uint16Array(d.buffer,d.byteOffset,d.byteLength/2):"32"===p&&(t=new Uint32Array(d.buffer,d.byteOffset,d.byteLength/4))),{n:l,m:o,seed0:f,hashSeed:y||0,bucketSizes:h,seedStream:a,validationMode:p,fingerprints:t,seedZeroBitmap:c||void 0}}(e)),this.n=e.n,this.m=e.m,this.seed0=e.seed0,this.hashSeed=e.hashSeed||0,this.validationMode=e.validationMode||"none",0===this.n){this.offsets=new Uint32Array(0),this.seeds=new Int32Array(0);return}this.offsets=new Uint32Array(this.m+1);let t=0;for(let i=0;i<this.m;i++){this.offsets[i]=t;let n=e.bucketSizes[i>>>1];t+=1&i?n>>>4:15&n}this.offsets[this.m]=t,this.seeds=new Int32Array(this.m);let i=0,r=e.seedStream,l=e.seedZeroBitmap;for(let e=0;e<this.m;e++){let t=!1;if(l&&(l[e>>>3]&1<<(7&e))!=0&&(t=!0),t)this.seeds[e]=0;else{let t=0,n=0;for(;;){let e=r[i++];if(t|=(127&e)<<n,(128&e)==0)break;n+=7}this.seeds[e]=t}}if("none"!==this.validationMode&&e.fingerprints){let t=e.fingerprints;"2"===this.validationMode||"4"===this.validationMode||"8"===this.validationMode?this.fingerprints=t instanceof Uint8Array?t:new Uint8Array(t):"16"===this.validationMode?this.fingerprints=t instanceof Uint16Array?t:new Uint16Array(t):this.fingerprints=t instanceof Uint32Array?t:new Uint32Array(t)}}}function p(e,t){return e^=t,e=Math.imul(e,0x85ebca6b),e^=e>>>13,e=Math.imul(e,0xc2b2ae35),(e^=e>>>16)>>>0}function b(e,t){let i=t;for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);i^=n=Math.imul(n=(n=Math.imul(n,0xcc9e2d51))<<15|n>>>17,0x1b873593),i=Math.imul(i=i<<13|i>>>19,5)+0xe6546b64}return i^=e.length,i^=i>>>16,i=Math.imul(i,0x85ebca6b),i^=i>>>13,i=Math.imul(i,0xc2b2ae35),(i^=i>>>16)>>>0}d(y,"FP_SEED",0x1234abcd);class w{write(e){for(;e>=128;)this.buffer.push(127&e|128),e>>>=7;this.buffer.push(e)}toUint8Array(){return new Uint8Array(this.buffer)}constructor(){d(this,"buffer",[])}}function g(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function m(e,i){let n,r=Object.keys(e),s=new Set;for(let t of r)for(let i of e[t])s.add(i);let l=Array.from(s),f=c(l,{level:i?.level,outputBinary:!0,onlySet:i?.onlySet??"8"}),a=new y(f),u=new Map;for(let t=0;t<r.length;t++)for(let i of e[r[t]])u.has(i)||u.set(i,[]),u.get(i).push(t);let d=0;for(let[e,t]of u)t.length>1&&d++;if(d<.1*l.length){let e=Math.ceil(Math.log2(r.length+1)),t=new h,i=new Map,s=new Int32Array(a.n).fill(-1);for(let[e,t]of u){let n=a.hash(e);n>=0&&(1===t.length?s[n]=t[0]:(s[n]=r.length,i.set(n,t)))}for(let i=0;i<a.n;i++){let n=s[i];t.write(n>=0?n:0,e)}n={mmpHashDictBin:f,keys:r,valueToKeyIndexes:t.getData(),bitsPerKey:e,collisionMap:i.size>0?i:void 0}}else{let t=[];for(let i of r){let n=e[i],r=[];for(let e of n){let t=a.hash(e);t>=0&&r.push(t)}r.sort((e,t)=>e-t),t.push(new Uint32Array(r))}n={mmpHashDictBin:f,keys:r,keyToHashes:t}}if(i?.outputBinary){let e=function(e){let i=[],n=new TextEncoder,r=e=>{let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!1),t};for(let t of(i.push(r(e.mmpHashDictBin.length)),i.push(e.mmpHashDictBin),i.push(r(e.keys.length)),e.keys)){let e=n.encode(t);i.push(r(e.length)),i.push(e)}if(e.valueToKeyIndexes&&void 0!==e.bitsPerKey)if(i.push(r(0xffffffff)),i.push(r(e.bitsPerKey)),i.push(r(e.valueToKeyIndexes.length)),i.push(e.valueToKeyIndexes),e.collisionMap&&e.collisionMap.size>0){let n=[];t(e.collisionMap.size,n);let s=Array.from(e.collisionMap.keys()).sort((e,t)=>e-t),l=0;for(let i of s){t(i-l,n),l=i;let r=e.collisionMap.get(i);t(r.length,n),r.sort((e,t)=>e-t);let s=0;for(let e of r)t(e-s,n),s=e}let o=new Uint8Array(n);i.push(r(o.length)),i.push(o)}else i.push(r(0));else if(e.keyToHashes){let n=[];for(let i of e.keyToHashes){if(t(i.length,n),0===i.length)continue;let e=0,r=0,s=[];for(let t=0;t<i.length;t++){let n=i[t],l=n-r;s.push(l),l>e&&(e=l),r=n}let l=0;e>0&&(l=Math.ceil(Math.log2(e+1))),n.push(l);let o=new h;for(let e of s)o.write(e,l);let f=o.getData();for(let e=0;e<f.length;e++)n.push(f[e])}let s=new Uint8Array(n);i.push(r(s.length)),i.push(s)}let s=new Uint8Array(i.reduce((e,t)=>e+t.length,0)),l=0;for(let e of i)s.set(e,l),l+=e.length;return s}(n);return i?.enableCompression?o(e):e}return i?.enableCompression?Promise.resolve(n):n}function A(e){let t=new DataView(e.buffer,e.byteOffset,e.byteLength),n=0,r=new TextDecoder,s=()=>{let e=t.getUint32(n,!1);return n+=4,e},l=s(),o=e.subarray(n,n+l);n+=l;let f=s(),h=[];for(let t=0;t<f;t++){let t=s(),i=e.subarray(n,n+t);n+=t,h.push(r.decode(i))}let u=s();if(0xffffffff===u){let t,r=s(),l=s(),f=e.subarray(n,n+l);n+=l;let a=s();if(a>0){let r=e.subarray(n,n+a);n+=a,t=new Map;let s=0,{value:l,bytes:o}=i(r,0);s+=o;let f=0;for(let e=0;e<l;e++){let{value:e,bytes:n}=i(r,s);s+=n;let l=f+e;f=l;let{value:o,bytes:h}=i(r,s);s+=h;let a=[],u=0;for(let e=0;e<o;e++){let{value:e,bytes:t}=i(r,s);s+=t;let n=u+e;u=n,a.push(n)}t.set(l,a)}}return{mmpHashDictBin:o,keys:h,valueToKeyIndexes:f,bitsPerKey:r,collisionMap:t}}{let t=e.subarray(n,n+u);n+=u;let r=[],s=0;for(let e=0;e<f;e++){let{value:e,bytes:n}=i(t,s);if(s+=n,0===e){r.push(new Uint32Array(0));continue}let l=t[s];s+=1;let o=Math.ceil(l*e/8),f=t.subarray(s,s+o);s+=o;let h=new a(f),u=new Uint32Array(e),d=0;for(let t=0;t<e;t++)d+=h.read(l),u[t]=d;r.push(u)}return{mmpHashDictBin:o,keys:h,keyToHashes:r}}}class M{static async fromCompressed(e){return new M(A(await f(e)))}static fromBinary(e){return new M(A(e))}buildInvertedIndex(){if(!this.dict.keyToHashes)return;let e=this.mph.n;this._invertedIndex=Array.from({length:e},()=>[]);for(let t=0;t<this.dict.keys.length;t++){let i=this.dict.keyToHashes[t];for(let n=0;n<i.length;n++){let r=i[n];r<e&&this._invertedIndex[r].push(t)}}}query(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=u(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);if(i===this.dict.keys.length){if(this.dict.collisionMap&&this.dict.collisionMap.has(t)){let e=this.dict.collisionMap.get(t);return e.length>0?this.dict.keys[e[0]]:null}return null}return i>=this.dict.keys.length?null:this.dict.keys[i]}let t=this.queryAll(e);return t&&t.length>0?t[0]:null}queryAll(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=u(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);return i===this.dict.keys.length?this.dict.collisionMap&&this.dict.collisionMap.has(t)?this.dict.collisionMap.get(t).map(e=>this.dict.keys[e]):null:i>=this.dict.keys.length?null:[this.dict.keys[i]]}let t=this.mph.hash(e);if(t<0||!this._invertedIndex||t>=this._invertedIndex.length)return null;let i=this._invertedIndex[t];if(0===i.length)return null;let n=[];for(let e of i)n.push(this.dict.keys[e]);return n.length>0?n:null}keys(){return this.dict.keys}constructor(e){g(this,"mph",void 0),g(this,"dict",void 0),g(this,"_invertedIndex",null),e instanceof Uint8Array&&(e=A(e)),this.dict=e,this.mph=new y(e.mmpHashDictBin),e.keyToHashes&&this.buildInvertedIndex()}}export{y as MinMPHash,M as MinMPLookup,c as createMinMPHashDict,m as createMinMPLookupDict};
|
package/dist/runtime.js
CHANGED
|
@@ -330,7 +330,7 @@ function deserializeLookupDict(data) {
|
|
|
330
330
|
keys.push(decoder.decode(kBytes));
|
|
331
331
|
}
|
|
332
332
|
const sectionLen = readU32();
|
|
333
|
-
if (
|
|
333
|
+
if (0xffffffff === sectionLen) {
|
|
334
334
|
const bitsPerKey = readU32();
|
|
335
335
|
const dataLen = readU32();
|
|
336
336
|
const valueToKeyIndexes = data.subarray(offset, offset + dataLen);
|
|
@@ -480,11 +480,11 @@ class MinMPLookup {
|
|
|
480
480
|
return this.dict.keys;
|
|
481
481
|
}
|
|
482
482
|
constructor(dict){
|
|
483
|
-
MinMPLookup_define_property(this, "dict", void 0);
|
|
484
483
|
MinMPLookup_define_property(this, "mph", void 0);
|
|
485
|
-
MinMPLookup_define_property(this, "
|
|
484
|
+
MinMPLookup_define_property(this, "dict", void 0);
|
|
485
|
+
MinMPLookup_define_property(this, "_invertedIndex", null);
|
|
486
|
+
if (dict instanceof Uint8Array) dict = deserializeLookupDict(dict);
|
|
486
487
|
this.dict = dict;
|
|
487
|
-
this._invertedIndex = null;
|
|
488
488
|
this.mph = new MinMPHash_MinMPHash(dict.mmpHashDictBin);
|
|
489
489
|
if (dict.keyToHashes) this.buildInvertedIndex();
|
|
490
490
|
}
|
package/dist/runtime.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t){let i=0,s=0,r=0;for(;;){let n=e[t+r];if(i|=(127&n)<<s,r++,(128&n)==0)break;s+=7}return{value:i,bytes:r}}let i={encodeInt(e,t){e<24?t.push(0|e):e<=255?t.push(24,e):e<=65535?t.push(25,e>>8,255&e):t.push(26,e>>>24&255,e>>>16&255,e>>>8&255,255&e)},encodeBytes(e,t){let i=e.byteLength;i<24?t.push(64|i):i<=255?t.push(88,i):i<=65535?t.push(89,i>>8,255&i):t.push(90,i>>>24&255,i>>>16&255,i>>>8&255,255&i);for(let s=0;s<i;s++)t.push(e[s])},encodeNull(e){e.push(246)},encodeArrayHead(e,t){e<24&&t.push(128|e)},decode(e,t){let s=e.getUint8(t.current++),r=224&s,n=31&s,h=0;if(n<24)h=n;else if(24===n)h=e.getUint8(t.current),t.current+=1;else if(25===n)h=e.getUint16(t.current,!1),t.current+=2;else if(26===n)h=e.getUint32(t.current,!1),t.current+=4;else throw Error("Unsupported CBOR size");if(0===r)return h;if(64===r){let i=h,s=new Uint8Array(e.buffer.slice(e.byteOffset+t.current,e.byteOffset+t.current+i));return t.current+=i,s}if(128===r){let s=h,r=[];for(let n=0;n<s;n++)r.push(i.decode(e,t));return r}if(246===s)return null;throw Error(`Unknown CBOR type: ${s.toString(16)}`)}},s=["none","4","8","16","32","2"];async function r(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}class n{read(e){let t=0;for(let i=0;i<e;i++){if(this.byteOffset>=this.buffer.length)return 0;t|=(this.buffer[this.byteOffset]>>this.bitOffset&1)<<i,this.bitOffset++,8===this.bitOffset&&(this.byteOffset++,this.bitOffset=0)}return t}constructor(t){e(this,"buffer",void 0),e(this,"byteOffset",0),e(this,"bitOffset",0),this.buffer=t}}function h(e,t,i){let s=0,r=t;for(let t=0;t<i;t++){let i=r>>>3,n=7&r;if(i>=e.length)return 0;s|=(e[i]>>n&1)<<t,r++}return s}function l(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class f{static async fromCompressed(e){return new f(await r(e))}hash(e){if(0===this.n)return -1;let t=o(e,this.hashSeed),i=o(e,~this.hashSeed),s=Math.floor(((a(t,this.seed0)^i)>>>0)/0x100000000*this.m),r=this.offsets[s],n=this.offsets[s+1]-r;if(0===n)return -1;let h=0;if(h=1===n?r:r+((a(t,this.seeds[s])^i)>>>0)%n,"none"!==this.validationMode&&this.fingerprints){let t=o(e,f.FP_SEED);if("2"===this.validationMode){let e=h>>>2,i=(3&h)<<1;if((this.fingerprints[e]>>>i&3)!=(3&t))return -1}else if("4"===this.validationMode){let e=h>>>1,i=this.fingerprints[e];if(((1&h)==0?15&i:i>>>4&15)!=(15&t))return -1}else if("8"===this.validationMode){if(this.fingerprints[h]!==(255&t))return -1}else if("16"===this.validationMode){if(this.fingerprints[h]!==(65535&t))return -1}else if(this.fingerprints[h]!==t>>>0)return -1}return h}constructor(e){if(l(this,"n",void 0),l(this,"m",void 0),l(this,"seed0",void 0),l(this,"hashSeed",void 0),l(this,"offsets",void 0),l(this,"seeds",void 0),l(this,"validationMode",void 0),l(this,"fingerprints",null),e instanceof Uint8Array&&(e=function(e){let t,r=new DataView(e.buffer,e.byteOffset,e.byteLength),n=i.decode(r,{current:0});if(!Array.isArray(n)||n.length<7)throw Error("Invalid CBOR format");let[h,l,f,a,o,u,d,c,y]=n,b=s[u]||"none";return d&&"none"!==b&&("2"===b||"4"===b||"8"===b?t=d:"16"===b?t=new Uint16Array(d.buffer,d.byteOffset,d.byteLength/2):"32"===b&&(t=new Uint32Array(d.buffer,d.byteOffset,d.byteLength/4))),{n:h,m:l,seed0:f,hashSeed:y||0,bucketSizes:a,seedStream:o,validationMode:b,fingerprints:t,seedZeroBitmap:c||void 0}}(e)),this.n=e.n,this.m=e.m,this.seed0=e.seed0,this.hashSeed=e.hashSeed||0,this.validationMode=e.validationMode||"none",0===this.n){this.offsets=new Uint32Array(0),this.seeds=new Int32Array(0);return}this.offsets=new Uint32Array(this.m+1);let t=0;for(let i=0;i<this.m;i++){this.offsets[i]=t;let s=e.bucketSizes[i>>>1];t+=1&i?s>>>4:15&s}this.offsets[this.m]=t,this.seeds=new Int32Array(this.m);let r=0,n=e.seedStream,h=e.seedZeroBitmap;for(let e=0;e<this.m;e++){let t=!1;if(h&&(h[e>>>3]&1<<(7&e))!=0&&(t=!0),t)this.seeds[e]=0;else{let t=0,i=0;for(;;){let e=n[r++];if(t|=(127&e)<<i,(128&e)==0)break;i+=7}this.seeds[e]=t}}if("none"!==this.validationMode&&e.fingerprints){let t=e.fingerprints;"2"===this.validationMode||"4"===this.validationMode||"8"===this.validationMode?this.fingerprints=t instanceof Uint8Array?t:new Uint8Array(t):"16"===this.validationMode?this.fingerprints=t instanceof Uint16Array?t:new Uint16Array(t):this.fingerprints=t instanceof Uint32Array?t:new Uint32Array(t)}}}function a(e,t){return e^=t,e=Math.imul(e,0x85ebca6b),e^=e>>>13,e=Math.imul(e,0xc2b2ae35),(e^=e>>>16)>>>0}function o(e,t){let i=t;for(let t=0;t<e.length;t++){let s=e.charCodeAt(t);i^=s=Math.imul(s=(s=Math.imul(s,0xcc9e2d51))<<15|s>>>17,0x1b873593),i=Math.imul(i=i<<13|i>>>19,5)+0xe6546b64}return i^=e.length,i^=i>>>16,i=Math.imul(i,0x85ebca6b),i^=i>>>13,i=Math.imul(i,0xc2b2ae35),(i^=i>>>16)>>>0}function u(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function d(e){let i=new DataView(e.buffer,e.byteOffset,e.byteLength),s=0,r=new TextDecoder,h=()=>{let e=i.getUint32(s,!1);return s+=4,e},l=h(),f=e.subarray(s,s+l);s+=l;let a=h(),o=[];for(let t=0;t<a;t++){let t=h(),i=e.subarray(s,s+t);s+=t,o.push(r.decode(i))}let u=h();if(0xffffffff===u){let i,r=h(),n=h(),l=e.subarray(s,s+n);s+=n;let a=h();if(a>0){let r=e.subarray(s,s+a);s+=a,i=new Map;let n=0,{value:h,bytes:l}=t(r,0);n+=l;let f=0;for(let e=0;e<h;e++){let{value:e,bytes:s}=t(r,n);n+=s;let h=f+e;f=h;let{value:l,bytes:a}=t(r,n);n+=a;let o=[],u=0;for(let e=0;e<l;e++){let{value:e,bytes:i}=t(r,n);n+=i;let s=u+e;u=s,o.push(s)}i.set(h,o)}}return{mmpHashDictBin:f,keys:o,valueToKeyIndexes:l,bitsPerKey:r,collisionMap:i}}{let i=e.subarray(s,s+u);s+=u;let r=[],h=0;for(let e=0;e<a;e++){let{value:e,bytes:s}=t(i,h);if(h+=s,0===e){r.push(new Uint32Array(0));continue}let l=i[h];h+=1;let f=Math.ceil(l*e/8),a=i.subarray(h,h+f);h+=f;let o=new n(a),u=new Uint32Array(e),d=0;for(let t=0;t<e;t++)d+=o.read(l),u[t]=d;r.push(u)}return{mmpHashDictBin:f,keys:o,keyToHashes:r}}}l(f,"FP_SEED",0x1234abcd);class c{static async fromCompressed(e){return new c(d(await r(e)))}static fromBinary(e){return new c(d(e))}buildInvertedIndex(){if(!this.dict.keyToHashes)return;let e=this.mph.n;this._invertedIndex=Array.from({length:e},()=>[]);for(let t=0;t<this.dict.keys.length;t++){let i=this.dict.keyToHashes[t];for(let s=0;s<i.length;s++){let r=i[s];r<e&&this._invertedIndex[r].push(t)}}}query(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=h(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);if(i===this.dict.keys.length){if(this.dict.collisionMap&&this.dict.collisionMap.has(t)){let e=this.dict.collisionMap.get(t);return e.length>0?this.dict.keys[e[0]]:null}return null}return i>=this.dict.keys.length?null:this.dict.keys[i]}let t=this.queryAll(e);return t&&t.length>0?t[0]:null}queryAll(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=h(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);return i===this.dict.keys.length?this.dict.collisionMap&&this.dict.collisionMap.has(t)?this.dict.collisionMap.get(t).map(e=>this.dict.keys[e]):null:i>=this.dict.keys.length?null:[this.dict.keys[i]]}let t=this.mph.hash(e);if(t<0||!this._invertedIndex||t>=this._invertedIndex.length)return null;let i=this._invertedIndex[t];if(0===i.length)return null;let s=[];for(let e of i)s.push(this.dict.keys[e]);return s.length>0?s:null}keys(){return this.dict.keys}constructor(e){u(this,"
|
|
1
|
+
function e(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function t(e,t){let i=0,s=0,r=0;for(;;){let n=e[t+r];if(i|=(127&n)<<s,r++,(128&n)==0)break;s+=7}return{value:i,bytes:r}}let i={encodeInt(e,t){e<24?t.push(0|e):e<=255?t.push(24,e):e<=65535?t.push(25,e>>8,255&e):t.push(26,e>>>24&255,e>>>16&255,e>>>8&255,255&e)},encodeBytes(e,t){let i=e.byteLength;i<24?t.push(64|i):i<=255?t.push(88,i):i<=65535?t.push(89,i>>8,255&i):t.push(90,i>>>24&255,i>>>16&255,i>>>8&255,255&i);for(let s=0;s<i;s++)t.push(e[s])},encodeNull(e){e.push(246)},encodeArrayHead(e,t){e<24&&t.push(128|e)},decode(e,t){let s=e.getUint8(t.current++),r=224&s,n=31&s,h=0;if(n<24)h=n;else if(24===n)h=e.getUint8(t.current),t.current+=1;else if(25===n)h=e.getUint16(t.current,!1),t.current+=2;else if(26===n)h=e.getUint32(t.current,!1),t.current+=4;else throw Error("Unsupported CBOR size");if(0===r)return h;if(64===r){let i=h,s=new Uint8Array(e.buffer.slice(e.byteOffset+t.current,e.byteOffset+t.current+i));return t.current+=i,s}if(128===r){let s=h,r=[];for(let n=0;n<s;n++)r.push(i.decode(e,t));return r}if(246===s)return null;throw Error(`Unknown CBOR type: ${s.toString(16)}`)}},s=["none","4","8","16","32","2"];async function r(e){let t=new Blob([e]).stream().pipeThrough(new DecompressionStream("gzip"));return new Uint8Array(await new Response(t).arrayBuffer())}class n{read(e){let t=0;for(let i=0;i<e;i++){if(this.byteOffset>=this.buffer.length)return 0;t|=(this.buffer[this.byteOffset]>>this.bitOffset&1)<<i,this.bitOffset++,8===this.bitOffset&&(this.byteOffset++,this.bitOffset=0)}return t}constructor(t){e(this,"buffer",void 0),e(this,"byteOffset",0),e(this,"bitOffset",0),this.buffer=t}}function h(e,t,i){let s=0,r=t;for(let t=0;t<i;t++){let i=r>>>3,n=7&r;if(i>=e.length)return 0;s|=(e[i]>>n&1)<<t,r++}return s}function l(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}class f{static async fromCompressed(e){return new f(await r(e))}hash(e){if(0===this.n)return -1;let t=o(e,this.hashSeed),i=o(e,~this.hashSeed),s=Math.floor(((a(t,this.seed0)^i)>>>0)/0x100000000*this.m),r=this.offsets[s],n=this.offsets[s+1]-r;if(0===n)return -1;let h=0;if(h=1===n?r:r+((a(t,this.seeds[s])^i)>>>0)%n,"none"!==this.validationMode&&this.fingerprints){let t=o(e,f.FP_SEED);if("2"===this.validationMode){let e=h>>>2,i=(3&h)<<1;if((this.fingerprints[e]>>>i&3)!=(3&t))return -1}else if("4"===this.validationMode){let e=h>>>1,i=this.fingerprints[e];if(((1&h)==0?15&i:i>>>4&15)!=(15&t))return -1}else if("8"===this.validationMode){if(this.fingerprints[h]!==(255&t))return -1}else if("16"===this.validationMode){if(this.fingerprints[h]!==(65535&t))return -1}else if(this.fingerprints[h]!==t>>>0)return -1}return h}constructor(e){if(l(this,"n",void 0),l(this,"m",void 0),l(this,"seed0",void 0),l(this,"hashSeed",void 0),l(this,"offsets",void 0),l(this,"seeds",void 0),l(this,"validationMode",void 0),l(this,"fingerprints",null),e instanceof Uint8Array&&(e=function(e){let t,r=new DataView(e.buffer,e.byteOffset,e.byteLength),n=i.decode(r,{current:0});if(!Array.isArray(n)||n.length<7)throw Error("Invalid CBOR format");let[h,l,f,a,o,u,d,c,y]=n,b=s[u]||"none";return d&&"none"!==b&&("2"===b||"4"===b||"8"===b?t=d:"16"===b?t=new Uint16Array(d.buffer,d.byteOffset,d.byteLength/2):"32"===b&&(t=new Uint32Array(d.buffer,d.byteOffset,d.byteLength/4))),{n:h,m:l,seed0:f,hashSeed:y||0,bucketSizes:a,seedStream:o,validationMode:b,fingerprints:t,seedZeroBitmap:c||void 0}}(e)),this.n=e.n,this.m=e.m,this.seed0=e.seed0,this.hashSeed=e.hashSeed||0,this.validationMode=e.validationMode||"none",0===this.n){this.offsets=new Uint32Array(0),this.seeds=new Int32Array(0);return}this.offsets=new Uint32Array(this.m+1);let t=0;for(let i=0;i<this.m;i++){this.offsets[i]=t;let s=e.bucketSizes[i>>>1];t+=1&i?s>>>4:15&s}this.offsets[this.m]=t,this.seeds=new Int32Array(this.m);let r=0,n=e.seedStream,h=e.seedZeroBitmap;for(let e=0;e<this.m;e++){let t=!1;if(h&&(h[e>>>3]&1<<(7&e))!=0&&(t=!0),t)this.seeds[e]=0;else{let t=0,i=0;for(;;){let e=n[r++];if(t|=(127&e)<<i,(128&e)==0)break;i+=7}this.seeds[e]=t}}if("none"!==this.validationMode&&e.fingerprints){let t=e.fingerprints;"2"===this.validationMode||"4"===this.validationMode||"8"===this.validationMode?this.fingerprints=t instanceof Uint8Array?t:new Uint8Array(t):"16"===this.validationMode?this.fingerprints=t instanceof Uint16Array?t:new Uint16Array(t):this.fingerprints=t instanceof Uint32Array?t:new Uint32Array(t)}}}function a(e,t){return e^=t,e=Math.imul(e,0x85ebca6b),e^=e>>>13,e=Math.imul(e,0xc2b2ae35),(e^=e>>>16)>>>0}function o(e,t){let i=t;for(let t=0;t<e.length;t++){let s=e.charCodeAt(t);i^=s=Math.imul(s=(s=Math.imul(s,0xcc9e2d51))<<15|s>>>17,0x1b873593),i=Math.imul(i=i<<13|i>>>19,5)+0xe6546b64}return i^=e.length,i^=i>>>16,i=Math.imul(i,0x85ebca6b),i^=i>>>13,i=Math.imul(i,0xc2b2ae35),(i^=i>>>16)>>>0}function u(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function d(e){let i=new DataView(e.buffer,e.byteOffset,e.byteLength),s=0,r=new TextDecoder,h=()=>{let e=i.getUint32(s,!1);return s+=4,e},l=h(),f=e.subarray(s,s+l);s+=l;let a=h(),o=[];for(let t=0;t<a;t++){let t=h(),i=e.subarray(s,s+t);s+=t,o.push(r.decode(i))}let u=h();if(0xffffffff===u){let i,r=h(),n=h(),l=e.subarray(s,s+n);s+=n;let a=h();if(a>0){let r=e.subarray(s,s+a);s+=a,i=new Map;let n=0,{value:h,bytes:l}=t(r,0);n+=l;let f=0;for(let e=0;e<h;e++){let{value:e,bytes:s}=t(r,n);n+=s;let h=f+e;f=h;let{value:l,bytes:a}=t(r,n);n+=a;let o=[],u=0;for(let e=0;e<l;e++){let{value:e,bytes:i}=t(r,n);n+=i;let s=u+e;u=s,o.push(s)}i.set(h,o)}}return{mmpHashDictBin:f,keys:o,valueToKeyIndexes:l,bitsPerKey:r,collisionMap:i}}{let i=e.subarray(s,s+u);s+=u;let r=[],h=0;for(let e=0;e<a;e++){let{value:e,bytes:s}=t(i,h);if(h+=s,0===e){r.push(new Uint32Array(0));continue}let l=i[h];h+=1;let f=Math.ceil(l*e/8),a=i.subarray(h,h+f);h+=f;let o=new n(a),u=new Uint32Array(e),d=0;for(let t=0;t<e;t++)d+=o.read(l),u[t]=d;r.push(u)}return{mmpHashDictBin:f,keys:o,keyToHashes:r}}}l(f,"FP_SEED",0x1234abcd);class c{static async fromCompressed(e){return new c(d(await r(e)))}static fromBinary(e){return new c(d(e))}buildInvertedIndex(){if(!this.dict.keyToHashes)return;let e=this.mph.n;this._invertedIndex=Array.from({length:e},()=>[]);for(let t=0;t<this.dict.keys.length;t++){let i=this.dict.keyToHashes[t];for(let s=0;s<i.length;s++){let r=i[s];r<e&&this._invertedIndex[r].push(t)}}}query(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=h(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);if(i===this.dict.keys.length){if(this.dict.collisionMap&&this.dict.collisionMap.has(t)){let e=this.dict.collisionMap.get(t);return e.length>0?this.dict.keys[e[0]]:null}return null}return i>=this.dict.keys.length?null:this.dict.keys[i]}let t=this.queryAll(e);return t&&t.length>0?t[0]:null}queryAll(e){if(this.dict.valueToKeyIndexes&&this.dict.bitsPerKey){let t=this.mph.hash(e);if(t<0||t>=this.mph.n)return null;let i=h(this.dict.valueToKeyIndexes,t*this.dict.bitsPerKey,this.dict.bitsPerKey);return i===this.dict.keys.length?this.dict.collisionMap&&this.dict.collisionMap.has(t)?this.dict.collisionMap.get(t).map(e=>this.dict.keys[e]):null:i>=this.dict.keys.length?null:[this.dict.keys[i]]}let t=this.mph.hash(e);if(t<0||!this._invertedIndex||t>=this._invertedIndex.length)return null;let i=this._invertedIndex[t];if(0===i.length)return null;let s=[];for(let e of i)s.push(this.dict.keys[e]);return s.length>0?s:null}keys(){return this.dict.keys}constructor(e){u(this,"mph",void 0),u(this,"dict",void 0),u(this,"_invertedIndex",null),e instanceof Uint8Array&&(e=d(e)),this.dict=e,this.mph=new f(e.mmpHashDictBin),e.keyToHashes&&this.buildInvertedIndex()}}export{f as MinMPHash,c as MinMPLookup};
|