From 9e52d50887bc6aad8c4b5b24d3661ffb8ca4e096 Mon Sep 17 00:00:00 2001 From: Nguyen Viet Dung <29406816+magnified103@users.noreply.github.com> Date: Fri, 8 Nov 2024 04:42:13 +0700 Subject: [PATCH] Fix symbol class --- packages/node/src/sync/encoder.ts | 6 ++- packages/node/src/sync/mapping.ts | 3 +- packages/node/src/sync/sketch.ts | 2 +- packages/node/src/sync/symbol.ts | 65 ++++++++++++++++++++----------- 4 files changed, 49 insertions(+), 27 deletions(-) diff --git a/packages/node/src/sync/encoder.ts b/packages/node/src/sync/encoder.ts index a1647bfdd..54912e417 100644 --- a/packages/node/src/sync/encoder.ts +++ b/packages/node/src/sync/encoder.ts @@ -1,3 +1,7 @@ +import { Symbol, HashedSymbol } from "./symbol.js" +import { RandomMapping } from "./mapping.js"; + + class SymbolMapping { sourceIdx: number; codedIdx: number; @@ -15,7 +19,7 @@ class MappingHeap { private fixHead(): void { let curr = 0; while (true) { - let child = curr * 2 + 1; + let child = (curr << 1) + 1; if (child >= this.heap.length) { break; } diff --git a/packages/node/src/sync/mapping.ts b/packages/node/src/sync/mapping.ts index 53a8dc02d..521ed7740 100644 --- a/packages/node/src/sync/mapping.ts +++ b/packages/node/src/sync/mapping.ts @@ -8,8 +8,7 @@ export class RandomMapping { } nextIndex(): number { - const multiplier = 0xda942042e4dd58b5n; - this.prng = (this.prng * multiplier) & 0xffffffffffffffffn; + // xorshift128++ this.lastIdx += Math.ceil( (this.lastIdx + 1.5) * (2 ** 32 / Math.sqrt(Number(this.prng) + 1) - 1), diff --git a/packages/node/src/sync/sketch.ts b/packages/node/src/sync/sketch.ts index 4da6d6965..2d7890b85 100644 --- a/packages/node/src/sync/sketch.ts +++ b/packages/node/src/sync/sketch.ts @@ -3,7 +3,7 @@ import { HashedSymbol, CodedSymbol } from "./symbol.js"; import { RandomMapping } from "./mapping.js"; import { Decoder } from "./decoder.js"; -class Sketch> { +export class Sketch> { s: CodedSymbol[] = []; addHashedSymbol(t: HashedSymbol) { diff --git a/packages/node/src/sync/symbol.ts b/packages/node/src/sync/symbol.ts index 2ff3cb840..fbc11cb6d 100644 --- a/packages/node/src/sync/symbol.ts +++ b/packages/node/src/sync/symbol.ts @@ -1,33 +1,52 @@ -export interface Symbol { - XOR(t2: T): T; - Hash(): number; -} +import * as crypto from "node:crypto"; + -export class HashedSymbol> { - Symbol: T; - Hash: number; +class HashedSymbol { + sum: Uint8Array; + checksum: Uint8Array; - constructor(symbol: T, hash: number) { - this.Symbol = symbol; - this.Hash = hash; + constructor(sum: Uint8Array, checksum?: Uint8Array) { + this.sum = new Uint8Array(sum); + if (checksum !== undefined) { + this.checksum = new Uint8Array(checksum); + } else { + this.checksum = crypto.createHmac("sha1", "").update(sum).digest(); + } } -} -export class CodedSymbol> extends HashedSymbol { - Count: number; + XOR(s: HashedSymbol) { + for (let i = 0; i < this.sum.length; i++) { + this.sum[i] ^= s.sum[i]; + } + for (let i = 0; i < this.checksum.length; i++) { + this.sum[i] ^= s.sum[i]; + } + } - constructor(symbol: T, hash: number, count = 0) { - super(symbol, hash); - this.Count = count; + isPure(): boolean { + const checksum = crypto.createHmac("sha1", "").update(this.sum).digest(); + if (checksum.length !== this.checksum.length) { + return false; + } + for (let i = 0; i < checksum.length; i++) { + if (checksum[i] !== this.checksum[i]) { + return false; + } + } + return true; } +} + +export class CodedSymbol extends HashedSymbol { + count: number; - static readonly ADD = 1; - static readonly REMOVE = -1; + constructor(sum: Uint8Array, checksum?: Uint8Array, count = 1) { + super(sum, checksum); + this.count = count; + } - apply(s: HashedSymbol, direction: number): CodedSymbol { - this.Symbol = this.Symbol.XOR(s.Symbol); - this.Hash ^= s.Hash; - this.Count += direction; - return this; + apply(s: HashedSymbol, direction: number) { + this.XOR(s); + this.count += direction; } }