UNPKG

gnablib

Version:

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

2 lines 9.48 kB
/*! Copyright 2023-2025 the gnablib contributors MPL-1.1 */ import{asLE as t}from"../endian/platform.js";import{U64 as s,U64MutArray as a}from"../primitive/number/U64.js";import{AHashsum32 as i}from"./_AHashsum.js";const e=s.fromI32s(3735928559,3735928559);export class SpookyShort extends i{constructor(t=s.zero,i=s.zero){super(16,32),this.seed=t,this.seed2=i,this._state=a.fromLen(4),this._b64=a.fromBytes(this._b8.buffer),this._state.at(0).set(t),this._state.at(1).set(i),this._state.at(2).set(e),this._state.at(3).set(e),this._bPos=16}hash(){t.i32(this._b8,0,8),this._state.at(0).addEq(this._b64.at(0)),this._state.at(1).addEq(this._b64.at(1)),this._state.at(2).addEq(this._b64.at(2)),this._state.at(3).addEq(this._b64.at(3)),this._state.at(2).lRotEq(50).addEq(this._state.at(3)),this._state.at(0).xorEq(this._state.at(2)),this._state.at(3).lRotEq(52).addEq(this._state.at(0)),this._state.at(1).xorEq(this._state.at(3)),this._state.at(0).lRotEq(30).addEq(this._state.at(1)),this._state.at(2).xorEq(this._state.at(0)),this._state.at(1).lRotEq(41).addEq(this._state.at(2)),this._state.at(3).xorEq(this._state.at(1)),this._state.at(2).lRotEq(54).addEq(this._state.at(3)),this._state.at(0).xorEq(this._state.at(2)),this._state.at(3).lRotEq(48).addEq(this._state.at(0)),this._state.at(1).xorEq(this._state.at(3)),this._state.at(0).lRotEq(38).addEq(this._state.at(1)),this._state.at(2).xorEq(this._state.at(0)),this._state.at(1).lRotEq(37).addEq(this._state.at(2)),this._state.at(3).xorEq(this._state.at(1)),this._state.at(2).lRotEq(62).addEq(this._state.at(3)),this._state.at(0).xorEq(this._state.at(2)),this._state.at(3).lRotEq(34).addEq(this._state.at(0)),this._state.at(1).xorEq(this._state.at(3)),this._state.at(0).lRotEq(5).addEq(this._state.at(1)),this._state.at(2).xorEq(this._state.at(0)),this._state.at(1).lRotEq(36).addEq(this._state.at(2)),this._state.at(3).xorEq(this._state.at(1)),this._bPos=0}final(){t.i32(this._b8,0,8),this._state.at(0).addEq(this._b64.at(0)),this._state.at(1).addEq(this._b64.at(1)),this._state.at(2).addEq(this._b64.at(2)),this._state.at(3).addEq(this._b64.at(3)),this._state.at(3).xorEq(this._state.at(2)),this._state.at(2).lRotEq(15),this._state.at(3).addEq(this._state.at(2)),this._state.at(0).xorEq(this._state.at(3)),this._state.at(3).lRotEq(52),this._state.at(0).addEq(this._state.at(3)),this._state.at(1).xorEq(this._state.at(0)),this._state.at(0).lRotEq(26),this._state.at(1).addEq(this._state.at(0)),this._state.at(2).xorEq(this._state.at(1)),this._state.at(1).lRotEq(51),this._state.at(2).addEq(this._state.at(1)),this._state.at(3).xorEq(this._state.at(2)),this._state.at(2).lRotEq(28),this._state.at(3).addEq(this._state.at(2)),this._state.at(0).xorEq(this._state.at(3)),this._state.at(3).lRotEq(9),this._state.at(0).addEq(this._state.at(3)),this._state.at(1).xorEq(this._state.at(0)),this._state.at(0).lRotEq(47),this._state.at(1).addEq(this._state.at(0)),this._state.at(2).xorEq(this._state.at(1)),this._state.at(1).lRotEq(54),this._state.at(2).addEq(this._state.at(1)),this._state.at(3).xorEq(this._state.at(2)),this._state.at(2).lRotEq(32),this._state.at(3).addEq(this._state.at(2)),this._state.at(0).xorEq(this._state.at(3)),this._state.at(3).lRotEq(25),this._state.at(0).addEq(this._state.at(3)),this._state.at(1).xorEq(this._state.at(0)),this._state.at(0).lRotEq(63),this._state.at(1).addEq(this._state.at(0))}clone(){const t=new SpookyShort(this.seed,this.seed2);return t._state.set(this._state),t._b8.set(this._b8),t._ingestBytes=this._ingestBytes,t._bPos=this._bPos,t}sumIn(){this._bPos>=1&&this._bPos<16?(this._b8.fill(0,this._bPos,16),this._b64.at(2).set(this._b64.at(0)),this._b64.at(3).set(this._b64.at(1)),this._b64.at(0).set(s.zero),this._b64.at(1).set(s.zero)):this._b8.fill(0,this._bPos),this._b64.at(3).addEq(s.fromI32s(0,this._ingestBytes<<24)),15&this._bPos||(this._b64.at(2).addEq(e),this._b64.at(3).addEq(e)),this.final();return this._state.toBytesBE().slice(0,16)}}export class SpookyLong extends i{constructor(t=s.zero,i=s.zero){super(16,96),this.seed=t,this.seed2=i,this._state=a.fromLen(12),this._b64=a.fromBytes(this._b8.buffer),this._state.at(0).set(t),this._state.at(1).set(i),this._state.at(2).set(e),this._state.at(3).set(t),this._state.at(4).set(i),this._state.at(5).set(e),this._state.at(6).set(t),this._state.at(7).set(i),this._state.at(8).set(e),this._state.at(9).set(t),this._state.at(10).set(i),this._state.at(11).set(e)}hash(){t.i64(this._b8,0,12),this._state.at(0).addEq(this._b64.at(0)),this._state.at(2).xorEq(this._state.at(10)),this._state.at(11).xorEq(this._state.at(0)).addEq(this._state.at(1)),this._state.at(0).lRotEq(11),this._state.at(1).addEq(this._b64.at(1)),this._state.at(3).xorEq(this._state.at(11)),this._state.at(0).xorEq(this._state.at(1)).addEq(this._state.at(2)),this._state.at(1).lRotEq(32),this._state.at(2).addEq(this._b64.at(2)),this._state.at(4).xorEq(this._state.at(0)),this._state.at(1).xorEq(this._state.at(2)).addEq(this._state.at(3)),this._state.at(2).lRotEq(43),this._state.at(3).addEq(this._b64.at(3)),this._state.at(5).xorEq(this._state.at(1)),this._state.at(2).xorEq(this._state.at(3)).addEq(this._state.at(4)),this._state.at(3).lRotEq(31),this._state.at(4).addEq(this._b64.at(4)),this._state.at(6).xorEq(this._state.at(2)),this._state.at(3).xorEq(this._state.at(4)).addEq(this._state.at(5)),this._state.at(4).lRotEq(17),this._state.at(5).addEq(this._b64.at(5)),this._state.at(7).xorEq(this._state.at(3)),this._state.at(4).xorEq(this._state.at(5)).addEq(this._state.at(6)),this._state.at(5).lRotEq(28),this._state.at(6).addEq(this._b64.at(6)),this._state.at(8).xorEq(this._state.at(4)),this._state.at(5).xorEq(this._state.at(6)).addEq(this._state.at(7)),this._state.at(6).lRotEq(39),this._state.at(7).addEq(this._b64.at(7)),this._state.at(9).xorEq(this._state.at(5)),this._state.at(6).xorEq(this._state.at(7)).addEq(this._state.at(8)),this._state.at(7).lRotEq(57),this._state.at(8).addEq(this._b64.at(8)),this._state.at(10).xorEq(this._state.at(6)),this._state.at(7).xorEq(this._state.at(8)).addEq(this._state.at(9)),this._state.at(8).lRotEq(55),this._state.at(9).addEq(this._b64.at(9)),this._state.at(11).xorEq(this._state.at(7)),this._state.at(8).xorEq(this._state.at(9)).addEq(this._state.at(10)),this._state.at(9).lRotEq(54),this._state.at(10).addEq(this._b64.at(10)),this._state.at(0).xorEq(this._state.at(8)),this._state.at(9).xorEq(this._state.at(10)).addEq(this._state.at(11)),this._state.at(10).lRotEq(22),this._state.at(11).addEq(this._b64.at(11)),this._state.at(1).xorEq(this._state.at(9)),this._state.at(10).xorEq(this._state.at(11)).addEq(this._state.at(0)),this._state.at(11).lRotEq(46),this._bPos=0}finalPartial(){this._state.at(11).addEq(this._state.at(1)),this._state.at(2).xorEq(this._state.at(11)),this._state.at(1).lRotEq(44),this._state.at(0).addEq(this._state.at(2)),this._state.at(3).xorEq(this._state.at(0)),this._state.at(2).lRotEq(15),this._state.at(1).addEq(this._state.at(3)),this._state.at(4).xorEq(this._state.at(1)),this._state.at(3).lRotEq(34),this._state.at(2).addEq(this._state.at(4)),this._state.at(5).xorEq(this._state.at(2)),this._state.at(4).lRotEq(21),this._state.at(3).addEq(this._state.at(5)),this._state.at(6).xorEq(this._state.at(3)),this._state.at(5).lRotEq(38),this._state.at(4).addEq(this._state.at(6)),this._state.at(7).xorEq(this._state.at(4)),this._state.at(6).lRotEq(33),this._state.at(5).addEq(this._state.at(7)),this._state.at(8).xorEq(this._state.at(5)),this._state.at(7).lRotEq(10),this._state.at(6).addEq(this._state.at(8)),this._state.at(9).xorEq(this._state.at(6)),this._state.at(8).lRotEq(13),this._state.at(7).addEq(this._state.at(9)),this._state.at(10).xorEq(this._state.at(7)),this._state.at(9).lRotEq(38),this._state.at(8).addEq(this._state.at(10)),this._state.at(11).xorEq(this._state.at(8)),this._state.at(10).lRotEq(53),this._state.at(9).addEq(this._state.at(11)),this._state.at(0).xorEq(this._state.at(9)),this._state.at(11).lRotEq(42),this._state.at(10).addEq(this._state.at(0)),this._state.at(1).xorEq(this._state.at(10)),this._state.at(0).lRotEq(54)}final(){t.i64(this._b8,0,12),this._state.at(0).addEq(this._b64.at(0)),this._state.at(1).addEq(this._b64.at(1)),this._state.at(2).addEq(this._b64.at(2)),this._state.at(3).addEq(this._b64.at(3)),this._state.at(4).addEq(this._b64.at(4)),this._state.at(5).addEq(this._b64.at(5)),this._state.at(6).addEq(this._b64.at(6)),this._state.at(7).addEq(this._b64.at(7)),this._state.at(8).addEq(this._b64.at(8)),this._state.at(9).addEq(this._b64.at(9)),this._state.at(10).addEq(this._b64.at(10)),this._state.at(11).addEq(this._b64.at(11)),this.finalPartial(),this.finalPartial(),this.finalPartial()}clone(){const t=new SpookyLong(this.seed,this.seed2);return t._state.set(this._state),t._b8.set(this._b8),t._ingestBytes=this._ingestBytes,t._bPos=this._bPos,t}sumIn(){this._b8.fill(0,this._bPos),this._b8[95]=this._ingestBytes%96,this.final();return this._state.toBytesBE().slice(0,16)}}export class Spooky extends SpookyShort{constructor(t=s.zero,a=s.zero){super(t,a),this._long=!1,this._l=new SpookyLong(t,a)}write(t){return this._long?this._l.write(t):t.length+this._ingestBytes>192?(this._long=!0,this._l.write(t)):(super.write(t),void this._l.write(t))}clone(){const t=new Spooky(this.seed,this.seed2);return t._state.set(this._state),t._b8.set(this._b8),t._ingestBytes=this._ingestBytes,t._bPos=this._bPos,t._l=this._l.clone(),t._long=this._long,t}sum(){return this._long?this._l.sum():super.sum()}sumIn(){return this._long?this._l.sumIn():super.sumIn()}}