gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 2.63 kB
JavaScript
/*! Copyright 2023-2025 the gnablib contributors MPL-1.1 */
import{asLE as t}from"../endian/platform.js";import{AHashsum32 as s}from"./_AHashsum.js";export class Lookup3 extends s{constructor(t=0,s=0){super(8,12),this._state=Uint32Array.of(3735928559,3735928559,3735928559),this._b32=new Uint32Array(this._b8.buffer),this._state[0]+=t,this._state[1]+=t,this._state[2]+=t+s,this._seed=t,this._seed2=s}hash(){t.i32(this._b8,0,3),this._state[0]+=this._b32[0],this._state[1]+=this._b32[1],this._state[2]+=this._b32[2],this._state[0]-=this._state[2],this._state[0]^=this._state[2]<<4|this._state[2]>>>28,this._state[2]+=this._state[1],this._state[1]-=this._state[0],this._state[1]^=this._state[0]<<6|this._state[0]>>>26,this._state[0]+=this._state[2],this._state[2]-=this._state[1],this._state[2]^=this._state[1]<<8|this._state[1]>>>24,this._state[1]+=this._state[0],this._state[0]-=this._state[2],this._state[0]^=this._state[2]<<16|this._state[2]>>>16,this._state[2]+=this._state[1],this._state[1]-=this._state[0],this._state[1]^=this._state[0]<<19|this._state[0]>>>13,this._state[0]+=this._state[2],this._state[2]-=this._state[1],this._state[2]^=this._state[1]<<4|this._state[1]>>>28,this._state[1]+=this._state[0],this._bPos=0}final(){t.i32(this._b8,0,3),this._state[0]+=this._b32[0],this._state[1]+=this._b32[1],this._state[2]+=this._b32[2],this._state[2]^=this._state[1],this._state[2]-=this._state[1]<<14|this._state[1]>>>18,this._state[0]^=this._state[2],this._state[0]-=this._state[2]<<11|this._state[2]>>>21,this._state[1]^=this._state[0],this._state[1]-=this._state[0]<<25|this._state[0]>>>7,this._state[2]^=this._state[1],this._state[2]-=this._state[1]<<16|this._state[1]>>>16,this._state[0]^=this._state[2],this._state[0]-=this._state[2]<<4|this._state[2]>>>28,this._state[1]^=this._state[0],this._state[1]-=this._state[0]<<14|this._state[0]>>>18,this._state[2]^=this._state[1],this._state[2]-=this._state[1]<<24|this._state[1]>>>8}write(t){if(this._ingestBytes>0)throw new Error("Can only write to this hash once");this._state[0]+=t.length,this._state[1]+=t.length,this._state[2]+=t.length,t.length>0&&t.length%12==0?(super.write(t.subarray(0,t.length-1)),this._ingestBytes+=1,this._b8[this._bPos++]=t[t.length-1]):super.write(t)}clone(){const t=new Lookup3(this._seed,this._seed2);return t._state.set(this._state),t._b32.set(this._b32),t._ingestBytes=this._ingestBytes,t._bPos=this._bPos,t}sumIn(){this._ingestBytes>0&&(this._b8.fill(0,this._bPos),this.final());return new Uint8Array(this._state.slice(1).buffer)}sum32pair(){return this.sumIn(),[this._state[2],this._state[1]]}sum32(){return this.sumIn(),this._state[2]}}