4 ms·
Here is a comparsion with meowhash: https://twitter.com/mmozeiko/status/1106714583761215488 https://twitter.com/mmozeiko/status/1106714583761215488 Meow is fas
by joemanaco 8y ago
Here is a comparsion with meowhash: https://twitter.com/mmozeiko/status/1106714583761215488 https://twitter.com/mmozeiko/status/1106714583761215488
Meow is faster than xxh3 for all sizes, small or large.
- injinj 8y agoMeow is a freak of nature, it has a constant overhead for all of the small sizes. I added Meow to my test graphs: https://github.com/injinj/smhasher https://github.com/injinj/smhasher I still find xxh3 to slightly faster for small hashes on my machine (i9-7960X), except at the 128bit throughput size > 32b.
- injinj 8y agoHmm, Meow fails the TwoLongNeighbors test. More information on this test here: https://github.com/hmakholm/smhasher/blob/master/src/LongNeighborTest.md https://github.com/hmakholm/smhasher/blob/master/src/LongNei... [[[ Keyset 'TestLongNeighbors' Tests ]]] Looking for 2-bit collisions in the last 2400 bits. Looking for 4-bit collisions in the last 2048 bits. Looking for 6-bit collisions in the last 160 bits. Trying bases of length 10 to 300, 5 of each length. ......[16]...............[32]............... [48]...............[64]. Among 285 tested bases, we expected 4.25749e-06 bads. Actually there were 5. The most striking collision has surprise score 3.52004e+06 and length 46 bytes: 000: BD 8D 12 8C FB EE 75 2E 17 80 4E 26 8C E7 75 94 DA EF 12 8C 95 CA 91 0D 018: 08 BD 8D 5F F2 78 FF 64 88 27 88 3F 8E 8F CE FC E2 8A 99 CE 2B E3 ^D2^ ^7F^ ^18^ ^0B^ The hashes are length 8 bytes: 000: 35 C1 E6 5B 6B 66 C7 28 *********FAIL*********
- injinj 8y agoI can make Meow pass the LongNeighbors test by doubling the number of AES rounds on each pass. The original Meow algo: while(Len >= 64) { S0 = Meow128_AESDEC_Mem(S0, Source); S1 = Meow128_AESDEC_Mem(S1, Source + 16); S2 = Meow128_AESDEC_Mem(S2, Source + 32); S3 = Meow128_AESDEC_Mem(S3, Source + 48); Len -= 64; Source += 64; } The modified algo: while(Len >= 64) { S0 = Meow128_AESDEC_Mem(S0, Source); S0 = Meow128_AESDEC_Mem(S0, Source); S1 = Meow128_AESDEC_Mem(S1, Source + 16); S1 = Meow128_AESDEC_Mem(S1, Source + 16); S2 = Meow128_AESDEC_Mem(S2, Source + 32); S2 = Meow128_AESDEC_Mem(S2, Source + 32); S3 = Meow128_AESDEC_Mem(S3, Source + 48); S3 = Meow128_AESDEC_Mem(S3, Source + 48); Len -= 64; Source += 64; } (also changed the partial rounds, but this is not shown here) This doesn't change it's performance that much, maybe 1 or 2 extra CPU cycles. My i9 CPU must be able to run these extra rounds in parallel... I do have hyperthreading disabled, if that matters. Update: Ah, it does cause the bulk speed test to be 50% of the original (48MiB vs 24Mib). The small key test only adds 1/2/3/4 extra AES instructions since they are manipulating 16 bytes at a time. It looks like this is only taking a cycle.