Not sure about the SIMD angle & Java. Ref. impl. of Blake2B [in C] doesn't use it [last I looked at it]. I ~think it has to do with the endian bias of the algo.
There are a few optimized implementation in the BLAKE2 code package — https://github.com/BLAKE2/BLAKE2. "Ref" indeed doesn't use SIMD, but other implementations do use them. I think the claim that it's faster than MD5 is based on benchmarking SIMD implementations, and if I remember correctly, the reference one is a bit slower.
Yes, endianness conversion — that is, just reading uint64 or uint32 from byte arrays — if done in the most simple way by bit shifting can be a factor. Another factor that influenced performance of pure Go implementation (should be similar to Java) is bounds checking.
Well, it's supposed to beat MD5 straight up. Granted the claim is a bit hedged.
> if done in the most simple way by bit shifting can be a factor
Do you mean using byte swap instructions or is there an algorithm that I should know about? :)
* * *
Not byte swapping, just simple reading bytes and shifting them into the correct position in uint32 like this:
uint32 result = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0];
Which is slower than uint32 result = *b;
or if LE is not native: uint32 result = swap(*b);Sure, have seen those. No biggie, but my point was that vanila B2b (on C) is already neck and neck with MD5.
> uint32 result = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0];
Yep, akaik that's all you can do on the JVM & of course for 64bit it's even more work. I thought you meant some sort of magic number bit wizzardry :)
BLAKE2 is fast for many use cases, but its block size is 64 (for BLAKE2s) and 128 (for BLAKEb) bytes, so hashing anything shorter than the block size will take the same time as hashing the full block. SipHash was designed for fast hashing of short inputs (its block size is 8 bytes), which is why it's good for hash tables and similar uses.
As for performance in different languages: SipHash is pretty fast in any language that has native 64-bit integers, but is not so fast in those which don't (JavaScript). The same applies to BLAKE2b (but not BLAKE2s).
BLAKE2 is slower in Java than MD5 probably because it doesn't use SIMD instructions there, which give a good boost for it (as designed).