Closed frenchiveruti closed 3 years ago
Today I tested City{64,128}, MurMur3{32,128}, and BLAKE3 {portable,sse2,sse4.1,avx2,avx2+MAC} with SMhasher. My CPU doesn't support avx512 so I can't test that feature. I used the C implementation provided by the BLAKE3-team. I did not test xxHash because this was more about seeing how BLAKE3 compares to slower hashes.
BLAKE3 isn't the fastest, but it's really fast for a crypto hash and certainly fast enough for a lot of applications (3.1 GB/s).
BLAKE3 avx2 is about 14% faster than avx2 keyed (MAC), but keyed mode is still faster than MurMur3 x86 32-bit and SipHash (based on the README).
Even though there are faster hashes, BLAKE3 does offer some benefits that others don't. There's no performance hit for longer hashes since BLAKE3 "128" is just using the first 128 bits of a 512 bit hash. It's also crypto hash, so it's secure and it is faster than SipHash so you can use a secure hash with better performance.
Here are the averages of each bulk speed test. Note that these tests were done with an Intel i7-6920HQ CPU @ 2.90GHz on macOS while the tests in the README were done with an Intel i7-9700K on Ubuntu. I tried both -O3 and -O2 and there was no noticeable difference in performance.
Bulk speed test - 262144-byte keys
City128: 14446.48 MiB/sec, 39.00 cycles/hash, 5.049 bytes/cycle
City64: 13234.01 MiB/sec, 34.43 cycles/hash, 4.626 bytes/cycle
MurMur3 128: 6048.69 MiB/sec, 37.20 cycles/hash, 2.114 bytes/cycle
B3 64 avx2: 3243.54 MiB/sec, 245.18 cycles/hash, 1.134 bytes/cycle
B3 64 avx2+MAC: 2836.20 MiB/sec, 320.80 cycles/hash, 0.991 bytes/cycle
MurMur3 32: 2776.68 MiB/sec, 32.20 cycles/hash, 0.971 bytes/cycle
B3 64 SSE4.1: 1751.91 MiB/sec, 267.23 cycles/hash, 0.612 bytes/cycle
B3 64 SSE2: 1752.76 MiB/sec, 266.22 cycles/hash, 0.613 bytes/cycle
B3 64 Port: 653.89 MiB/sec, 364.02 cycles/hash, 0.229 bytes/cycle
The C implementation does not support multi-threading, which isn't important when you're talking about small keys. For completeness though, here is a rough comparison using 'time' on b3sum with 1 and 8 threads and xxhsum 128. The file was 2.7GB and as you can see 8 threads is 5x faster than 1 thread and it is actually faster than xxhsum 128 even though BLAKE3's hash is 4x larger.
b3sum, 1 thread 1.41s user 0.74s system 99% cpu 2.157 total
b3sum, 8 thread 1.98s user 0.80s system 645% cpu 0.431 total
xxhsum, 128 0.23s user 0.35s system 97% cpu 0.588 total
Here is the output of the full avx2 test. In the avalanche tests the average worst bias for City128 is 0.719833% and for BLAKE3 it is 0.700542%. As expected there were 0 collisions.
--- Testing BLAKE3 (BLAKE3, sse2-sse4.1-avx2, first 64 bits)
[[[ Sanity Tests ]]]
Verification value 0x21B14FF3 : Passed!
Running sanity check 1..........PASS
Running sanity check 2..........PASS
[[[ Speed Tests ]]]
Bulk speed test - 262144-byte keys
Alignment 0 - 1.137 bytes/cycle - 3253.36 MiB/sec @ 3 ghz
Alignment 1 - 1.153 bytes/cycle - 3298.43 MiB/sec @ 3 ghz
Alignment 2 - 1.147 bytes/cycle - 3281.58 MiB/sec @ 3 ghz
Alignment 3 - 1.150 bytes/cycle - 3290.07 MiB/sec @ 3 ghz
Alignment 4 - 1.144 bytes/cycle - 3274.03 MiB/sec @ 3 ghz
Alignment 5 - 1.148 bytes/cycle - 3285.03 MiB/sec @ 3 ghz
Alignment 6 - 1.141 bytes/cycle - 3264.17 MiB/sec @ 3 ghz
Alignment 7 - 1.049 bytes/cycle - 3001.61 MiB/sec @ 3 ghz
Small key speed test - 1-byte keys - 241.86 cycles/hash
Small key speed test - 2-byte keys - 240.30 cycles/hash
Small key speed test - 3-byte keys - 243.30 cycles/hash
Small key speed test - 4-byte keys - 242.44 cycles/hash
Small key speed test - 5-byte keys - 242.11 cycles/hash
Small key speed test - 6-byte keys - 245.16 cycles/hash
Small key speed test - 7-byte keys - 248.55 cycles/hash
Small key speed test - 8-byte keys - 239.50 cycles/hash
Small key speed test - 9-byte keys - 240.19 cycles/hash
Small key speed test - 10-byte keys - 244.72 cycles/hash
Small key speed test - 11-byte keys - 245.60 cycles/hash
Small key speed test - 12-byte keys - 240.26 cycles/hash
Small key speed test - 13-byte keys - 246.07 cycles/hash
Small key speed test - 14-byte keys - 246.27 cycles/hash
Small key speed test - 15-byte keys - 245.46 cycles/hash
Small key speed test - 16-byte keys - 240.79 cycles/hash
Small key speed test - 17-byte keys - 244.88 cycles/hash
Small key speed test - 18-byte keys - 246.39 cycles/hash
Small key speed test - 19-byte keys - 245.21 cycles/hash
Small key speed test - 20-byte keys - 243.80 cycles/hash
Small key speed test - 21-byte keys - 245.47 cycles/hash
Small key speed test - 22-byte keys - 246.17 cycles/hash
Small key speed test - 23-byte keys - 245.82 cycles/hash
Small key speed test - 24-byte keys - 246.31 cycles/hash
Small key speed test - 25-byte keys - 249.39 cycles/hash
Small key speed test - 26-byte keys - 246.74 cycles/hash
Small key speed test - 27-byte keys - 251.99 cycles/hash
Small key speed test - 28-byte keys - 250.04 cycles/hash
Small key speed test - 29-byte keys - 253.17 cycles/hash
Small key speed test - 30-byte keys - 246.64 cycles/hash
Small key speed test - 31-byte keys - 245.99 cycles/hash
[[[ Differential Tests ]]]
Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 64 bit hashes.
1000 reps, 8303632000 total tests, expecting 0.00 random collisions..........
0 total collisions, of which 0 single collisions were ignored
Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 64 bit hashes.
1000 reps, 11017632000 total tests, expecting 0.00 random collisions..........
0 total collisions, of which 0 single collisions were ignored
Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 64 bit hashes.
1000 reps, 2796416000 total tests, expecting 0.00 random collisions..........
0 total collisions, of which 0 single collisions were ignored
[[[ Avalanche Tests ]]]
Testing 32-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.646000%
Testing 40-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.644000%
Testing 48-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.671333%
Testing 56-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.701333%
Testing 64-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.693333%
Testing 72-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.688000%
Testing 80-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.635333%
Testing 88-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.742000%
Testing 96-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.854667%
Testing 104-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.720000%
Testing 112-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.682667%
Testing 120-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.767333%
Testing 128-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.701333%
Testing 136-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.708667%
Testing 144-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.704667%
Testing 152-bit keys -> 64-bit hashes, 300000 reps.......... worst bias is 0.648000%
[[[ Keyset 'Cyclic' Tests ]]]
Keyset 'Cyclic' - 8 cycles of 8 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 37 - 0.034%
Keyset 'Cyclic' - 8 cycles of 9 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 1 - 0.049%
Keyset 'Cyclic' - 8 cycles of 10 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 41 - 0.033%
Keyset 'Cyclic' - 8 cycles of 11 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 49 - 0.041%
Keyset 'Cyclic' - 8 cycles of 12 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 61 - 0.030%
[[[ Keyset 'TwoBytes' Tests ]]]
Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 16-bit window at bit 26 - 0.100%
Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 37 - 0.040%
Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 19 - 0.015%
Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.008%
Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 23 - 0.004%
[[[ Keyset 'Sparse' Tests ]]]
Keyset 'Sparse' - 32-bit keys with up to 6 bits set - 1149017 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 17-bit window at bit 54 - 0.079%
Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 46 - 0.044%
Keyset 'Sparse' - 48-bit keys with up to 5 bits set - 1925357 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 43 - 0.038%
Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 28 - 0.062%
Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 46 - 0.029%
Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 38 - 0.083%
Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 16 - 0.118%
Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 10 - 0.098%
[[[ Keyset 'Combination Lowbits' Tests ]]]
Keyset 'Combination' - up to 8 blocks from a set of 8 - 19173960 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 8 - 0.019%
[[[ Keyset 'Combination Highbits' Tests ]]]
Keyset 'Combination' - up to 8 blocks from a set of 8 - 19173960 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 37 - 0.020%
[[[ Keyset 'Combination 0x8000000' Tests ]]]
Keyset 'Combination' - up to 20 blocks from a set of 2 - 2097150 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 37 - 0.105%
[[[ Keyset 'Combination 0x0000001' Tests ]]]
Keyset 'Combination' - up to 20 blocks from a set of 2 - 2097150 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 36 - 0.098%
[[[ Keyset 'Combination Hi-Lo' Tests ]]]
Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 25 - 0.026%
[[[ Keyset 'Window' Tests ]]]
Keyset 'Windowed' - 128-bit key, 20-bit window - 128 tests, 1048576 keys per test
Window at 0 - Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
... (all expected 0.00 and actual was 0.00)
Window at 128 - Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
[[[ Keyset 'Text' Tests ]]]
Keyset 'Text' - keys of form "Foo[XXXX]Bar" - 14776336 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 20 - 0.021%
Keyset 'Text' - keys of form "FooBar[XXXX]" - 14776336 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 39 - 0.017%
Keyset 'Text' - keys of form "[XXXX]FooBar" - 14776336 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 39 - 0.012%
[[[ Keyset 'Zeroes' Tests ]]]
Keyset 'Zeroes' - 65536 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 12-bit window at bit 10 - 0.529%
Here is the result for City128, but there's not a lot of difference in the bias.
--- Testing City128 (Google CityHash128WithSeed)
[[[ Sanity Tests ]]]
Verification value 0x6531F54E : Passed!
Running sanity check 1..........PASS
Running sanity check 2..........PASS
[[[ Speed Tests ]]]
Bulk speed test - 262144-byte keys
Alignment 0 - 4.648 bytes/cycle - 13297.83 MiB/sec @ 3 ghz
Alignment 1 - 4.170 bytes/cycle - 11930.62 MiB/sec @ 3 ghz
Alignment 2 - 4.934 bytes/cycle - 14115.35 MiB/sec @ 3 ghz
Alignment 3 - 4.921 bytes/cycle - 14077.76 MiB/sec @ 3 ghz
Alignment 4 - 4.881 bytes/cycle - 13965.41 MiB/sec @ 3 ghz
Alignment 5 - 5.082 bytes/cycle - 14539.85 MiB/sec @ 3 ghz
Alignment 6 - 5.085 bytes/cycle - 14547.73 MiB/sec @ 3 ghz
Alignment 7 - 4.882 bytes/cycle - 13966.94 MiB/sec @ 3 ghz
Small key speed test - 1-byte keys - 29.87 cycles/hash
Small key speed test - 2-byte keys - 30.10 cycles/hash
Small key speed test - 3-byte keys - 30.27 cycles/hash
Small key speed test - 4-byte keys - 29.29 cycles/hash
Small key speed test - 5-byte keys - 28.85 cycles/hash
Small key speed test - 6-byte keys - 28.98 cycles/hash
Small key speed test - 7-byte keys - 31.68 cycles/hash
Small key speed test - 8-byte keys - 29.79 cycles/hash
Small key speed test - 9-byte keys - 30.63 cycles/hash
Small key speed test - 10-byte keys - 32.29 cycles/hash
Small key speed test - 11-byte keys - 35.20 cycles/hash
Small key speed test - 12-byte keys - 31.56 cycles/hash
Small key speed test - 13-byte keys - 31.30 cycles/hash
Small key speed test - 14-byte keys - 35.51 cycles/hash
Small key speed test - 15-byte keys - 38.55 cycles/hash
Small key speed test - 16-byte keys - 31.36 cycles/hash
Small key speed test - 17-byte keys - 41.58 cycles/hash
Small key speed test - 18-byte keys - 46.38 cycles/hash
Small key speed test - 19-byte keys - 61.39 cycles/hash
Small key speed test - 20-byte keys - 51.81 cycles/hash
Small key speed test - 21-byte keys - 45.80 cycles/hash
Small key speed test - 22-byte keys - 53.10 cycles/hash
Small key speed test - 23-byte keys - 50.97 cycles/hash
Small key speed test - 24-byte keys - 48.51 cycles/hash
Small key speed test - 25-byte keys - 54.88 cycles/hash
Small key speed test - 26-byte keys - 58.37 cycles/hash
Small key speed test - 27-byte keys - 57.93 cycles/hash
Small key speed test - 28-byte keys - 61.62 cycles/hash
Small key speed test - 29-byte keys - 52.53 cycles/hash
Small key speed test - 30-byte keys - 51.96 cycles/hash
Small key speed test - 31-byte keys - 54.99 cycles/hash
[[[ Differential Tests ]]]
Testing 8303632 up-to-5-bit differentials in 64-bit keys -> 128 bit hashes.
1000 reps, 8303632000 total tests, expecting 0.00 random collisions..........
0 total collisions, of which 0 single collisions were ignored
Testing 11017632 up-to-4-bit differentials in 128-bit keys -> 128 bit hashes.
1000 reps, 11017632000 total tests, expecting 0.00 random collisions..........
0 total collisions, of which 0 single collisions were ignored
Testing 2796416 up-to-3-bit differentials in 256-bit keys -> 128 bit hashes.
1000 reps, 2796416000 total tests, expecting 0.00 random collisions..........
0 total collisions, of which 0 single collisions were ignored
[[[ Avalanche Tests ]]]
Testing 32-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.652000%
Testing 40-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.597333%
Testing 48-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.700667%
Testing 56-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.711333%
Testing 64-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.727333%
Testing 72-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.672667%
Testing 80-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.762000%
Testing 88-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.708667%
Testing 96-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.770667%
Testing 104-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.722000%
Testing 112-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.773333%
Testing 120-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.770667%
Testing 128-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.715333%
Testing 136-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.717333%
Testing 144-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.733333%
Testing 152-bit keys -> 128-bit hashes, 300000 reps.......... worst bias is 0.782667%
[[[ Keyset 'Cyclic' Tests ]]]
Keyset 'Cyclic' - 8 cycles of 16 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 87 - 0.036%
Keyset 'Cyclic' - 8 cycles of 17 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 47 - 0.030%
Keyset 'Cyclic' - 8 cycles of 18 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 125 - 0.033%
Keyset 'Cyclic' - 8 cycles of 19 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 57 - 0.037%
Keyset 'Cyclic' - 8 cycles of 20 bytes - 10000000 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 5 - 0.029%
[[[ Keyset 'TwoBytes' Tests ]]]
Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 16-bit window at bit 84 - 0.125%
Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 43 - 0.084%
Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 110 - 0.017%
Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 53 - 0.009%
Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 37 - 0.004%
[[[ Keyset 'Sparse' Tests ]]]
Keyset 'Sparse' - 32-bit keys with up to 6 bits set - 1149017 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 17-bit window at bit 32 - 0.100%
Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 7 - 0.053%
Keyset 'Sparse' - 48-bit keys with up to 5 bits set - 1925357 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 17-bit window at bit 106 - 0.091%
Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 102 - 0.063%
Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 14 - 0.032%
Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 70 - 0.073%
Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 97 - 0.064%
Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 85 - 0.113%
[[[ Keyset 'Combination Lowbits' Tests ]]]
Keyset 'Combination' - up to 8 blocks from a set of 8 - 19173960 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 63 - 0.021%
[[[ Keyset 'Combination Highbits' Tests ]]]
Keyset 'Combination' - up to 8 blocks from a set of 8 - 19173960 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 71 - 0.017%
[[[ Keyset 'Combination 0x8000000' Tests ]]]
Keyset 'Combination' - up to 20 blocks from a set of 2 - 2097150 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 24 - 0.079%
[[[ Keyset 'Combination 0x0000001' Tests ]]]
Keyset 'Combination' - up to 20 blocks from a set of 2 - 2097150 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 18-bit window at bit 83 - 0.082%
[[[ Keyset 'Combination Hi-Lo' Tests ]]]
Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 4 - 0.028%
[[[ Keyset 'Window' Tests ]]]
Keyset 'Windowed' - 256-bit key, 20-bit window - 256 tests, 1048576 keys per test
Window at 0 - Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
... (all expected 0.00 and actual was 0.00)
Window at 256 - Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
[[[ Keyset 'Text' Tests ]]]
Keyset 'Text' - keys of form "Foo[XXXX]Bar" - 14776336 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 55 - 0.024%
Keyset 'Text' - keys of form "FooBar[XXXX]" - 14776336 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 20-bit window at bit 12 - 0.032%
Keyset 'Text' - keys of form "[XXXX]FooBar" - 14776336 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 19-bit window at bit 12 - 0.027%
[[[ Keyset 'Zeroes' Tests ]]]
Keyset 'Zeroes' - 65536 keys
Testing collisions - Expected 0.00, actual 0.00 ( 0.00x)
Testing distribution - Worst bias is the 13-bit window at bit 49 - 0.410%
good idea, BLAKE3 is supposed to be ridiculously fast by
cryptographically secure hashes
-standards, i'm guessing it will end up faster than Murmur3 and slower than City32 (assuming all hashes are only allowed to run on 1 thread, or that the input sizes are small enough that it doesn't matter, and AVX-512 cpu... okay that's a lot of assumptions)