Since you're here, you have most certainly seen my last C++-related post, wherein I implemented compile-time AES encryption using C++ templates.

Today, I bring you CubeHash. Now, you might be wondering of what use is a compile-time implementation of CubeHash. Template metaprogramming is used here for a very specific task: to compute the initial state.

The CubeHash specification dictates that the initial 1024-bit (or 32-word) state is computed from the parameters

*h*(output hash bit length),*b*(the number of bytes to mix with the state each round), and*r*(number of rounds) as follows:- Place the 32-bit value h/8 in state[0];
- Place the 32-bit value b in state[1];
- Place the 32-bit value r in state[2];
- Fill state[3] through state[31] with 0;
- Apply the CubeHash round function
*10r*times.

To compute the initial CubeHash state, then, we have to be able to compute the full round function. And that's exactly what we did. The following C++ header file implements all possible variants of CubeHash easily, since all that changes between them are the

Here it is: CubeHash. Have fun.

*h*,*b*and*r*parameters. The implementation itself is based on the reference*simple*implementation, available from SUPERCOP. Switching to a faster SSE2 implementation is trivial.Here it is: CubeHash. Have fun.