# taxicat1.github.io

submited by
Style Pass
2022-01-14 18:30:07

It hashes down a 64-bit input to a 32-bit output. It has good mixing: basic statistical analysis can show that it has reasonably good avalanche effect if lacking in bit independence (certain pairs of bits of the output like to flip at the same time when the input changes in a specific way, in some cases more than 99% of the time). However this hash function has a more glaring flaw which is the lack of fan-out.

Fan-out is necessary for a hash algorithm, otherwise you could simply trace backwards and generate an input that produces a specific hash (this is called a preimage). To visualize fan-out, imagine a hash function \$H\$ that uses three smaller independent functions \$A\$, \$B\$, and \$C\$ to produce a hash like so:

If an attacker wanted to manipulate the output value \$H(i)\$, they may start by tweaking \$i\$ to output a specific value in \$A(i)\$. However in doing so \$B(i)\$ and \$C(i)\$ now also produce different values. It is very difficult to control the outputs of all three of these functions at once (unless perhaps they are not so independent). The input value has “fanned out” into several functions, which come together at the end.

A common pattern is to use some invertible convolution \$C\$ and compute \$C(i) + i\$. This way, reversing the algorithm requires first taking a guess at what \$i\$ may have been, then calculating \$C^{-1}(h - i)\$ for the given output \$h\$. This value then must match the guessed \$i\$, but it all likelihood it will not. Algorithms like MD5, SHA1 and SHA2, and Salsa20/ChaCha20 use this pattern.