Cyan4973 / xxHash

Extremely fast non-cryptographic hash algorithm
http://www.xxhash.com/
Other
9.18k stars 777 forks source link

[Suggestion] Add BLAKE3 to comparison table. #450

Closed frenchiveruti closed 3 years ago

divinity76 commented 4 years ago

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)

anmull commented 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%