UNPKG

gnablib

Version:

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

2 lines 1.63 kB
/*! Copyright 2023-2025 the gnablib contributors MPL-1.1 */ import{asBE as t,asLE as s}from"../endian/platform.js";import{U32 as i}from"../primitive/number/U32Static.js";import{AHashsum32 as e}from"./_AHashsum.js";const h=2654435761,_=2246822519,a=3266489917,o=374761393;export class XxHash32 extends e{constructor(t=0){super(4,16),this._state=new Uint32Array(4),this._b32=new Uint32Array(this._b8.buffer),this._seed=t,this._state[0]=this._seed+h+_,this._state[1]=this._seed+_,this._state[2]=this._seed,this._state[3]=this._seed-h}hash(){s.i32(this._b8,0,4),this._state[0]=Math.imul(i.lRot(this._state[0]+Math.imul(this._b32[0],_),13),h),this._state[1]=Math.imul(i.lRot(this._state[1]+Math.imul(this._b32[1],_),13),h),this._state[2]=Math.imul(i.lRot(this._state[2]+Math.imul(this._b32[2],_),13),h),this._state[3]=Math.imul(i.lRot(this._state[3]+Math.imul(this._b32[3],_),13),h),this._bPos=0}clone(){const t=new XxHash32(this._seed);return t._state.set(this._state),t._b32.set(this._b32),t._ingestBytes=this._ingestBytes,t._bPos=this._bPos,t}_sum(){let t=this._ingestBytes;this._ingestBytes>=this._b8.length?t+=i.lRot(this._state[0],1)+i.lRot(this._state[1],7)+i.lRot(this._state[2],12)+i.lRot(this._state[3],18):t+=this._seed+o;let e=this._bPos,r=0;for(;e>=4;r++)s.i32(this._b8,4*r),t=Math.imul(i.lRot(t+Math.imul(this._b32[r],a),17),668265263),e-=4;for(r*=4;r<this._bPos;r++)t=Math.imul(i.lRot(t+this._b8[r]*o,11),h);return t^=t>>>15,t=Math.imul(t,_),t^=t>>>13,t=Math.imul(t,a),t^=t>>>16,t}sumIn(){const s=Uint32Array.of(this._sum()),i=new Uint8Array(s.slice(0,1).buffer);return t.i32(i),i}sum32(){return this.clone()._sum()>>>0}}