MurMur3 in Excel [ENG]

Developed by Austin Appleby. It is part of the MurmurHash family (Murmur1, Murmur2, Murmur3) and is mainly used in applications where speed, uniform distribution, and determinism are important; but not cryptographic security.

Implementation in Excel

For demonstration purposes, MurmurHash3 was compactly implemented as a single formula using lambda functions.

Code
=LET(dx;LAMBDA(x;y;LET(x;DEC2HEX(HEX2DEC(x);8);y;DEC2HEX(HEX2DEC(y);8);erg;MAKEARRAY(1;8;LAMBDA(z;s;DEC2HEX(BITXOR(HEX2DEC(MID(x;s;1));HEX2DEC(MID(y;s;1))))));CONCAT(erg)));dwm;LAMBDA(x;y;LET(x;DEC2HEX(HEX2DEC(x);8);y;DEC2HEX(HEX2DEC(y);8);bs;CONCAT(MAP(SEQUENCE(LEN(y));LAMBDA(v;HEX2BIN(MID(y;v;1);4))));erg;REDUCE(0;MAKEARRAY(1;LEN(bs);LAMBDA(z;s;MID(bs;s;1)));LAMBDA(a;z;MOD(IF(z="1";a*2+HEX2DEC(x);a*2);4294967296)));DEC2HEX(erg;8)));dwsr;LAMBDA(x;y;LET(x;DEC2HEX(HEX2DEC(x);8);bs;REPT("0";y)&LEFT(CONCAT(MAP(SEQUENCE(LEN(x));LAMBDA(v;HEX2BIN(MID(x;v;1);4))));32-y);CONCAT(BIN2HEX((MAKEARRAY(1;LEN(bs)/4;LAMBDA(zz;ss;MID(bs;(ss-1)*4+1;4))))))));dwsl;LAMBDA(x;y;LET(x;DEC2HEX(HEX2DEC(x);8);bs;RIGHT(CONCAT(MAP(SEQUENCE(LEN(x));LAMBDA(v;HEX2BIN(MID(x;v;1);4))));32-y)&REPT("0";y);CONCAT(BIN2HEX((MAKEARRAY(1;LEN(bs)/4;LAMBDA(zz;ss;MID(bs;(ss-1)*4+1;4))))))));lm;LAMBDA(t;LET(erg;CONCAT(MAKEARRAY(1;LEN(t)/2;LAMBDA(z;s;MID(t;LEN(t)-(s-1)*2-1;2))));IF(LEN(erg)<8;REPT("0";8-LEN(erg))&erg;erg)));dwadd;LAMBDA(x;y;LET(x;DEC2HEX(HEX2DEC(x);8);y;DEC2HEX(HEX2DEC(y);8);DEC2HEX(MOD(HEX2DEC(x)+HEX2DEC(y);4294967296))));dwor;LAMBDA(x;y;LET(x;DEC2HEX(HEX2DEC(x);8);y;DEC2HEX(HEX2DEC(y);8);DEC2HEX(MOD(BITOR(HEX2DEC(x);HEX2DEC(y));4294967296))));mpb;LAMBDA(x;dwadd(dwm(dwor(dwsl(x;13);dwsr(x;19));5);"e6546b64"));ms;LAMBDA(x;dwm(LET(k;dwm(x;"cc9e2d51");dwor(dwsl(k;15);dwsr(k;17)));"1b873593"));mf;LAMBDA(text;cur;LET(hx;dwm(LET(h;dwm(dx(dx(cur;DEC2HEX(LEN(text);8));dwsr(dx(cur;DEC2HEX(LEN(text);8));16));"85ebca6b");dx(h;dwsr(h;13)));"c2b2ae35");dx(hx;dwsr(hx;16))));LAMBDA(text;[seed];IF(LEN(text)=0;0;mf(text;REDUCE(IF(seed<>"";seed;"00000000");MAKEARRAY(1;ROUNDUP(LEN(text)/4;0);LAMBDA(z;s;LET(part;MID(text;(s-1)*4+1;4);(CONCAT(MAP(SEQUENCE(LEN(part));LAMBDA(x;DEC2HEX(CODE(MID(part;x;1));2))))))));LAMBDA(a;x;IF(LEN(x)=8;mpb(dx(a;ms(lm(x))));dx(a;ms(lm(x))))))))))

Macros were avoided; however, due to the use of lambda functions, the result will only run under Office 365 or Excel 2024.

SHA256: 29D389FC2B3A575305DA255E0DFCF6F7DDBD99A4CA8ADB399179B0B6672E0A4F