UNPKG

gnablib

Version:

A lean, zero dependency library to provide a useful base for your project.

2 lines 2.35 kB
/*! Copyright 2023-2025 the gnablib contributors MPL-1.1 */ import{asLE as t}from"../endian/platform.js";import{U32 as s}from"../primitive/number/U32Static.js";import{U64 as e,U64Mut as E,U64MutArray as q}from"../primitive/number/U64.js";import{AHashsum64 as a}from"./_AHashsum64.js";const i=e.fromI32s(2246822535,2654435761),o=e.fromI32s(668265295,3266489917),m=e.fromI32s(2654435833,374761393),h=e.fromI32s(3266489955,2246822519),l=e.fromI32s(374761413,668265263);export class XxHash64 extends a{constructor(t=e.zero){super(8,32),this._state=q.fromLen(4),this._b64=q.fromBytes(this._b8.buffer),this._seed=t,this._state.at(0).set(this._seed.mut().addEq(i).addEq(o)),this._state.at(1).set(this._seed.mut().addEq(o)),this._state.at(2).set(this._seed),this._state.at(3).set(this._seed).subEq(i)}hash(){t.i32(this._b8,0,8),this._state.at(0).addEq(this._b64.at(0).mulEq(o)).lRotEq(31).mulEq(i),this._state.at(1).addEq(this._b64.at(1).mulEq(o)).lRotEq(31).mulEq(i),this._state.at(2).addEq(this._b64.at(2).mulEq(o)).lRotEq(31).mulEq(i),this._state.at(3).addEq(this._b64.at(3).mulEq(o)).lRotEq(31).mulEq(i),this._bPos=0}clone(){const t=new XxHash64(this._seed);return t._state.set(this._state),t._b8.set(this._b8),t._ingestBytes.set(this._ingestBytes),t._bPos=this._bPos,t}sumIn(){const q=E.fromI32s(0,0);this._ingestBytes.gte(e.fromInt(this._b8.length))?(q.addEq(this._state.at(0).lRot(1)).addEq(this._state.at(1).lRot(7)).addEq(this._state.at(2).lRot(12)).addEq(this._state.at(3).lRot(18)),q.set(this._state.at(0).mut().mulEq(o).lRotEq(31).mulEq(i).xorEq(q).mulEq(i).addEq(h)),q.set(this._state.at(1).mut().mulEq(o).lRotEq(31).mulEq(i).xorEq(q).mulEq(i).addEq(h)),q.set(this._state.at(2).mut().mulEq(o).lRotEq(31).mulEq(i).xorEq(q).mulEq(i).addEq(h)),q.set(this._state.at(3).mut().mulEq(o).lRotEq(31).mulEq(i).xorEq(q).mulEq(i).addEq(h))):q.addEq(this._seed).addEq(l),q.addEq(this._ingestBytes);let a=this._bPos,r=0;for(t.i32(this._b8,0,8);a>=8;r++)q.set(q.xorEq(this._b64.at(r).mulEq(o).lRotEq(31).mulEq(i)).lRotEq(27).mulEq(i).addEq(h)),a-=8;for(r*=8,a>=4&&(q.set(E.fromI32s(s.fromBytesLE(this._b8,r),0).mulEq(i).xorEq(q).lRotEq(23).mulEq(o).addEq(m)),r+=4);r<this._bPos;r++)q.set(E.fromI32s(this._b8[r],0).mulEq(l).xorEq(q).lRotEq(11).mulEq(i));return q.xorEq(q.rShift(33)),q.mulEq(o),q.xorEq(q.rShift(29)),q.mulEq(m),q.xorEq(q.rShift(32)),q.toBytesBE()}}