MurmurHash3 ist eine nicht-kryptographische Hashfunktion, die 2011 von Austin Appleby entwickelt wurde. Sie ist Teil der MurmurHash-Familie (Murmur1, Murmur2, Murmur3) und wird vor allem in Anwendungen verwendet, bei denen Geschwindigkeit, gleichmäßige Verteilung und Determinismus wichtig sind; nicht aber kryptografische Sicherheit.
Implementierung in Excel
Zur Demonstration wurde MurmurHash3 kompakt als eine Formel über Lambda-Funktionen implementiert.
Code
=LET(dx;LAMBDA(x;y;LET(x;DEZINHEX(HEXINDEZ(x);8);y;DEZINHEX(HEXINDEZ(y);8);erg;MATRIXERSTELLEN(1;8;LAMBDA(z;s;DEZINHEX(BITXODER(HEXINDEZ(TEIL(x;s;1));HEXINDEZ(TEIL(y;s;1))))));TEXTKETTE(erg)));dwm;LAMBDA(x;y;LET(x;DEZINHEX(HEXINDEZ(x);8);y;DEZINHEX(HEXINDEZ(y);8);bs;TEXTKETTE(MAP(SEQUENZ(LÄNGE(y));LAMBDA(v;HEXINBIN(TEIL(y;v;1);4))));erg;REDUCE(0;MATRIXERSTELLEN(1;LÄNGE(bs);LAMBDA(z;s;TEIL(bs;s;1)));LAMBDA(a;z;REST(WENN(z="1";a*2+HEXINDEZ(x);a*2);4294967296)));DEZINHEX(erg;8)));dwsr;LAMBDA(x;y;LET(x;DEZINHEX(HEXINDEZ(x);8);bs;WIEDERHOLEN("0";y)&LINKS(TEXTKETTE(MAP(SEQUENZ(LÄNGE(x));LAMBDA(v;HEXINBIN(TEIL(x;v;1);4))));32-y);TEXTKETTE(BININHEX((MATRIXERSTELLEN(1;LÄNGE(bs)/4;LAMBDA(zz;ss;TEIL(bs;(ss-1)*4+1;4))))))));dwsl;LAMBDA(x;y;LET(x;DEZINHEX(HEXINDEZ(x);8);bs;RECHTS(TEXTKETTE(MAP(SEQUENZ(LÄNGE(x));LAMBDA(v;HEXINBIN(TEIL(x;v;1);4))));32-y)&WIEDERHOLEN("0";y);TEXTKETTE(BININHEX((MATRIXERSTELLEN(1;LÄNGE(bs)/4;LAMBDA(zz;ss;TEIL(bs;(ss-1)*4+1;4))))))));lm;LAMBDA(t;LET(erg;TEXTKETTE(MATRIXERSTELLEN(1;LÄNGE(t)/2;LAMBDA(z;s;TEIL(t;LÄNGE(t)-(s-1)*2-1;2))));WENN(LÄNGE(erg)<8;WIEDERHOLEN("0";8-LÄNGE(erg))&erg;erg)));dwadd;LAMBDA(x;y;LET(x;DEZINHEX(HEXINDEZ(x);8);y;DEZINHEX(HEXINDEZ(y);8);DEZINHEX(REST(HEXINDEZ(x)+HEXINDEZ(y);4294967296))));dwor;LAMBDA(x;y;LET(x;DEZINHEX(HEXINDEZ(x);8);y;DEZINHEX(HEXINDEZ(y);8);DEZINHEX(REST(BITODER(HEXINDEZ(x);HEXINDEZ(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;DEZINHEX(LÄNGE(text);8));dwsr(dx(cur;DEZINHEX(LÄNGE(text);8));16));"85ebca6b");dx(h;dwsr(h;13)));"c2b2ae35");dx(hx;dwsr(hx;16))));LAMBDA(text;[seed];WENN(LÄNGE(text)=0;0;mf(text;REDUCE(WENN(seed<>"";seed;"00000000");MATRIXERSTELLEN(1;AUFRUNDEN(LÄNGE(text)/4;0);LAMBDA(z;s;LET(part;TEIL(text;(s-1)*4+1;4);(TEXTKETTE(MAP(SEQUENZ(LÄNGE(part));LAMBDA(x;DEZINHEX(CODE(TEIL(part;x;1));2))))))));LAMBDA(a;x;WENN(LÄNGE(x)=8;mpb(dx(a;ms(lm(x))));dx(a;ms(lm(x))))))))))

Auf Makros wurde verzichtet; aufgrund der Lambda-Funktionen wird das Ergebnis jedoch nur unter Office 365 oder Excel 2024 lauffähig sein.
SHA256: 5EBEB78ADB92EF9BB4356050227FB9C77996F16B215EDF81180E03D02DEA295D
