rurban / smhasher

Hash function quality and speed tests
https://rurban.github.io/smhasher/
Other
1.81k stars 174 forks source link

wyhash_gamma release #116

Closed wangyi-fudan closed 4 years ago

wangyi-fudan commented 4 years ago

Dear All: Hope you are well. Best wishes. wyhash_gamma has been released, with incredible speed for short keys and very small code size. the key discovery is the "one shot read" of __uint128_t. The speed can not be measured by current SMHasher speed test, but can be observed by xxHash test suite with inline modification or by my benchmark.cpp

/usr/share/dict/words hash function short hash/us bulk_256B GB/s bulk_64KB GB/s
wyhash 326.53 14.07 11.68
xxh3_scalar 151.35 7.08 12.68
xxh3_avx2 136.03 8.71 30.37
xxHash64 99.12 11.40 14.65
t1ha2_atonce 106.19 12.94 17.03
wangyi-fudan commented 4 years ago

Today, it is this fast...

/usr/share/dict/words hash function short hash/us bulk_256B GB/s bulk_64KB GB/s
wyhash 396.13 13.54 11.73
xxh3_scalar 150.90 6.31 12.59
xxh3_avx2 151.54 10.41 26.07
xxHash64 99.12 11.44 14.72
t1ha2_atonce 107.82 12.99 17.12
dumblob commented 4 years ago

@wangyi-fudan could you please post results with unmodified smhasher (and maybe other) tests here? In other words, I consider the reasoning behind non-inlining the tests valid and thus would want to see that.

Other smhasher results (i.e. the quality of the hash, not just speed - including "blinding multiplication" and "no reads past buffer boundaries" and "endianess") would be also nice as the algorithm changed too much to anticipate the same high quality behavior as the "classic wyhash" versions (up to including wyhash v6).

wangyi-fudan commented 4 years ago

hi, the speed result is not from smhasher, but from my own benchmark.cpp which is inlining.

this hash passed all smhasher tests. no "blinding multiplication", both endianess is works.

the only trick is the "one-shot reads" learnt from t1ha. it reads passed buffer boundaries, both before and after, up to 8 byte. but with shifts, it passed smhasher sainity check. Also from other users, a define is avalible to use conventional safe reads.

dumblob commented 4 years ago

the speed result is not from smhasher, but from my own benchmark.cpp which is inlining.

I'm asking, because it seems without inlining (e.g. in smhasher), the speed difference for small keys won't be that significant, but the bulk speed will be significantly lower than the others - that would indicate wyhash being less useful than before.

On the other hand I know there is the effort to support inlining advantages for certain hashes, but for now I'd really stick to a fair smhasher comparison :wink:.

the only trick is the "one-shot reads" learnt from t1ha. it reads passed buffer boundaries, both before and after, up to 8 byte. but with shifts, it passed smhasher sainity check. Also from other users, a define is avalible to use conventional safe reads.

I don't think boundaries are thoroughly being checked for sanity in smhasher (as it wasn't a concern with majority of existing hash functions) - therefore I pointed it out.

Also from other users, a define is avalible to use conventional safe reads.

Oh, cool you re-introduced the condom again. Thanks! Yesterday it wasn't there yet and the whole code didn't look finished.

Could you re-run smhasher tests and speed tests with the condom to see the speed and quality differences?

wangyi-fudan commented 4 years ago

--- Testing wyhash "wyhash gamma (64-bit, little-endian)" GOOD

[[[ Sanity Tests ]]]

Verification value 0x1D68E565 ....... PASS Running sanity check 1 .......... PASS Running AppendedZeroesTest .......... PASS

[[[ Speed Tests ]]]

Bulk speed test - 262144-byte keys Alignment 7 - 5.438 bytes/cycle - 15557.74 MiB/sec @ 3 ghz Alignment 6 - 5.438 bytes/cycle - 15559.00 MiB/sec @ 3 ghz Alignment 5 - 5.438 bytes/cycle - 15559.64 MiB/sec @ 3 ghz Alignment 4 - 5.438 bytes/cycle - 15558.83 MiB/sec @ 3 ghz Alignment 3 - 5.438 bytes/cycle - 15559.67 MiB/sec @ 3 ghz Alignment 2 - 5.438 bytes/cycle - 15557.37 MiB/sec @ 3 ghz Alignment 1 - 5.437 bytes/cycle - 15554.38 MiB/sec @ 3 ghz Alignment 0 - 5.440 bytes/cycle - 15563.14 MiB/sec @ 3 ghz Average - 5.438 bytes/cycle - 15558.72 MiB/sec @ 3 ghz

Small key speed test - 1-byte keys - 19.00 cycles/hash Small key speed test - 2-byte keys - 19.00 cycles/hash Small key speed test - 3-byte keys - 19.00 cycles/hash Small key speed test - 4-byte keys - 19.00 cycles/hash Small key speed test - 5-byte keys - 19.00 cycles/hash Small key speed test - 6-byte keys - 19.00 cycles/hash Small key speed test - 7-byte keys - 19.00 cycles/hash Small key speed test - 8-byte keys - 19.00 cycles/hash Small key speed test - 9-byte keys - 19.00 cycles/hash Small key speed test - 10-byte keys - 19.00 cycles/hash Small key speed test - 11-byte keys - 19.00 cycles/hash Small key speed test - 12-byte keys - 18.00 cycles/hash Small key speed test - 13-byte keys - 18.00 cycles/hash Small key speed test - 14-byte keys - 18.00 cycles/hash Small key speed test - 15-byte keys - 18.00 cycles/hash Small key speed test - 16-byte keys - 18.00 cycles/hash Small key speed test - 17-byte keys - 22.00 cycles/hash Small key speed test - 18-byte keys - 22.00 cycles/hash Small key speed test - 19-byte keys - 22.00 cycles/hash Small key speed test - 20-byte keys - 22.00 cycles/hash Small key speed test - 21-byte keys - 22.00 cycles/hash Small key speed test - 22-byte keys - 22.00 cycles/hash Small key speed test - 23-byte keys - 22.00 cycles/hash Small key speed test - 24-byte keys - 22.00 cycles/hash Small key speed test - 25-byte keys - 22.00 cycles/hash Small key speed test - 26-byte keys - 22.00 cycles/hash Small key speed test - 27-byte keys - 22.00 cycles/hash Small key speed test - 28-byte keys - 22.00 cycles/hash Small key speed test - 29-byte keys - 22.00 cycles/hash Small key speed test - 30-byte keys - 22.00 cycles/hash Small key speed test - 31-byte keys - 22.00 cycles/hash Average 20.290 cycles/hash

[[[ 'Hashmap' Speed Tests ]]]

std::unordered_map Init std HashMapTest: 259.538 cycles/op (102305 inserts, 1% deletions) Running std HashMapTest: 155.819 cycles/op (0.3 stdv)

greg7mdp/parallel-hashmap Init fast HashMapTest: 159.311 cycles/op (102305 inserts, 1% deletions) Running fast HashMapTest: 97.697 cycles/op (0.2 stdv) ....... PASS

[[[ Avalanche Tests ]]]

Testing 24-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.587333% Testing 32-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.643333% Testing 40-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.714000% Testing 48-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.683333% Testing 56-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.638667% Testing 64-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.668000% Testing 72-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.712000% Testing 80-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.663333% Testing 96-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.662000% Testing 112-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.728667% Testing 128-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.786000% Testing 160-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.740000% Testing 192-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.735333% Testing 224-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.716000% Testing 256-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.793333% Testing 320-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.700000% Testing 384-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.820667% Testing 448-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.688000% Testing 512-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.697333% Testing 640-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.796000% Testing 768-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.791333% Testing 896-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.776000% Testing 1024-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.782000% Testing 1280-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.764667% Testing 1536-bit keys -> 64-bit hashes, 300000 reps worst bias is 0.854667%

[[[ Keyset 'Sparse' Tests ]]]

Keyset 'Sparse' - 16-bit keys with up to 9 bits set - 50643 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 0.6, actual 1 (1.67x) (1) Testing collisions (high 19-26 bits) - Worst is 24 bits: 79/152 (0.52x) Testing collisions (high 12-bit) - Expected 50643.0, actual 46547 (0.92x) Testing collisions (high 8-bit) - Expected 50643.0, actual 50387 (0.99x) (-256) Testing collisions (low 32-bit) - Expected 0.6, actual 0 (0.00x) Testing collisions (low 19-26 bits) - Worst is 25 bits: 40/76 (0.52x) Testing collisions (low 12-bit) - Expected 50643.0, actual 46547 (0.92x) Testing collisions (low 8-bit) - Expected 50643.0, actual 50387 (0.99x) (-256) Testing distribution - Worst bias is the 13-bit window at bit 31 - 0.605%

Keyset 'Sparse' - 24-bit keys with up to 8 bits set - 1271626 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 376.5, actual 190 (0.50x) Testing collisions (high 24-36 bits) - Worst is 35 bits: 29/47 (0.62x) Testing collisions (high 12-bit) - Expected 1271626.0, actual 1267530 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1271626.0, actual 1271370 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 376.5, actual 191 (0.51x) Testing collisions (low 24-36 bits) - Worst is 36 bits: 18/23 (0.76x) Testing collisions (low 12-bit) - Expected 1271626.0, actual 1267530 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1271626.0, actual 1271370 (1.00x) (-256) Testing distribution - Worst bias is the 17-bit window at bit 14 - 0.085%

Keyset 'Sparse' - 32-bit keys with up to 7 bits set - 4514873 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 4746.0, actual 2371 (0.50x) Testing collisions (high 26-39 bits) - Worst is 31 bits: 4766/9492 (0.50x) Testing collisions (high 12-bit) - Expected 4514873.0, actual 4510777 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 4514873.0, actual 4514617 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 4746.0, actual 2410 (0.51x) Testing collisions (low 26-39 bits) - Worst is 38 bits: 44/74 (0.59x) Testing collisions (low 12-bit) - Expected 4514873.0, actual 4510777 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 4514873.0, actual 4514617 (1.00x) (-256) Testing distribution - Worst bias is the 19-bit window at bit 20 - 0.058%

Keyset 'Sparse' - 40-bit keys with up to 6 bits set - 4598479 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 4923.4, actual 2444 (0.50x) Testing collisions (high 26-39 bits) - Worst is 36 bits: 160/307 (0.52x) Testing collisions (high 12-bit) - Expected 4598479.0, actual 4594383 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 4598479.0, actual 4598223 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 4923.4, actual 2468 (0.50x) Testing collisions (low 26-39 bits) - Worst is 29 bits: 19810/39387 (0.50x) Testing collisions (low 12-bit) - Expected 4598479.0, actual 4594383 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 4598479.0, actual 4598223 (1.00x) (-256) Testing distribution - Worst bias is the 19-bit window at bit 7 - 0.048%

Keyset 'Sparse' - 48-bit keys with up to 6 bits set - 14196869 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 46927.3, actual 23566 (0.50x) Testing collisions (high 28-43 bits) - Worst is 39 bits: 201/366 (0.55x) Testing collisions (high 12-bit) - Expected 14196869.0, actual 14192773 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 14196869.0, actual 14196613 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 46927.3, actual 23465 (0.50x) Testing collisions (low 28-43 bits) - Worst is 34 bits: 5924/11731 (0.50x) Testing collisions (low 12-bit) - Expected 14196869.0, actual 14192773 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 14196869.0, actual 14196613 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 24 - 0.022%

Keyset 'Sparse' - 56-bit keys with up to 5 bits set - 4216423 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 4139.3, actual 2051 (0.50x) Testing collisions (high 26-39 bits) - Worst is 29 bits: 16493/33114 (0.50x) Testing collisions (high 12-bit) - Expected 4216423.0, actual 4212327 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 4216423.0, actual 4216167 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 4139.3, actual 2085 (0.50x) Testing collisions (low 26-39 bits) - Worst is 39 bits: 20/32 (0.62x) Testing collisions (low 12-bit) - Expected 4216423.0, actual 4212327 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 4216423.0, actual 4216167 (1.00x) (-256) Testing distribution - Worst bias is the 19-bit window at bit 41 - 0.073%

Keyset 'Sparse' - 64-bit keys with up to 5 bits set - 8303633 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 16053.7, actual 7935 (0.49x) Testing collisions (high 27-41 bits) - Worst is 37 bits: 264/501 (0.53x) Testing collisions (high 12-bit) - Expected 8303633.0, actual 8299537 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 8303633.0, actual 8303377 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 16053.7, actual 7986 (0.50x) Testing collisions (low 27-41 bits) - Worst is 41 bits: 21/31 (0.67x) Testing collisions (low 12-bit) - Expected 8303633.0, actual 8299537 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 8303633.0, actual 8303377 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 11 - 0.041%

Keyset 'Sparse' - 72-bit keys with up to 5 bits set - 15082603 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 52965.5, actual 26674 (0.50x) Testing collisions (high 28-43 bits) - Worst is 43 bits: 24/25 (0.93x) Testing collisions (high 12-bit) - Expected 15082603.0, actual 15078507 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 15082603.0, actual 15082347 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 52965.5, actual 26421 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 19/25 (0.73x) Testing collisions (low 12-bit) - Expected 15082603.0, actual 15078507 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 15082603.0, actual 15082347 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 41 - 0.020%

Keyset 'Sparse' - 96-bit keys with up to 4 bits set - 3469497 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 2802.7, actual 1433 (0.51x) Testing collisions (high 26-39 bits) - Worst is 36 bits: 93/175 (0.53x) Testing collisions (high 12-bit) - Expected 3469497.0, actual 3465401 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 3469497.0, actual 3469241 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 2802.7, actual 1388 (0.50x) Testing collisions (low 26-39 bits) - Worst is 38 bits: 35/43 (0.80x) Testing collisions (low 12-bit) - Expected 3469497.0, actual 3465401 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 3469497.0, actual 3469241 (1.00x) (-256) Testing distribution - Worst bias is the 19-bit window at bit 54 - 0.086%

Keyset 'Sparse' - 112-bit keys with up to 4 bits set - 6445069 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 9671.5, actual 4814 (0.50x) Testing collisions (high 26-40 bits) - Worst is 37 bits: 152/302 (0.50x) Testing collisions (high 12-bit) - Expected 6445069.0, actual 6440973 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 6445069.0, actual 6444813 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 9671.5, actual 4908 (0.51x) Testing collisions (low 26-40 bits) - Worst is 40 bits: 24/37 (0.64x) Testing collisions (low 12-bit) - Expected 6445069.0, actual 6440973 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 6445069.0, actual 6444813 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 16 - 0.052%

Keyset 'Sparse' - 128-bit keys with up to 4 bits set - 11017633 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 28262.9, actual 14041 (0.50x) Testing collisions (high 27-42 bits) - Worst is 41 bits: 32/55 (0.58x) Testing collisions (high 12-bit) - Expected 11017633.0, actual 11013537 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 11017633.0, actual 11017377 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 28262.9, actual 14190 (0.50x) Testing collisions (low 27-42 bits) - Worst is 38 bits: 232/441 (0.53x) Testing collisions (low 12-bit) - Expected 11017633.0, actual 11013537 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 11017633.0, actual 11017377 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 19 - 0.028%

Keyset 'Sparse' - 144-bit keys with up to 4 bits set - 17676661 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 72751.3, actual 36055 (0.50x) Testing collisions (high 28-43 bits) - Worst is 38 bits: 589/1136 (0.52x) Testing collisions (high 12-bit) - Expected 17676661.0, actual 17672565 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 17676661.0, actual 17676405 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 72751.3, actual 36150 (0.50x) Testing collisions (low 28-43 bits) - Worst is 36 bits: 2278/4546 (0.50x) Testing collisions (low 12-bit) - Expected 17676661.0, actual 17672565 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 17676661.0, actual 17676405 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 56 - 0.020%

Keyset 'Sparse' - 160-bit keys with up to 4 bits set - 26977161 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 169446.5, actual 84513 (0.50x) Testing collisions (high 29-45 bits) - Worst is 45 bits: 14/20 (0.68x) Testing collisions (high 12-bit) - Expected 26977161.0, actual 26973065 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 26977161.0, actual 26976905 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 169446.5, actual 84524 (0.50x) Testing collisions (low 29-45 bits) - Worst is 43 bits: 43/82 (0.52x) Testing collisions (low 12-bit) - Expected 26977161.0, actual 26973065 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 26977161.0, actual 26976905 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 55 - 0.017%

Keyset 'Sparse' - 192-bit keys with up to 4 bits set - 56050289 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 731468.9, actual 363864 (0.50x) Testing collisions (high 30-47 bits) - Worst is 44 bits: 94/178 (0.53x) Testing collisions (high 12-bit) - Expected 56050289.0, actual 56046193 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 56050289.0, actual 56050033 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 731468.9, actual 364215 (0.50x) Testing collisions (low 30-47 bits) - Worst is 47 bits: 16/22 (0.72x) Testing collisions (low 12-bit) - Expected 56050289.0, actual 56046193 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 56050289.0, actual 56050033 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 6 - 0.005%

Keyset 'Sparse' - 256-bit keys with up to 3 bits set - 2796417 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1820.7, actual 885 (0.49x) Testing collisions (high 25-38 bits) - Worst is 38 bits: 17/28 (0.60x) Testing collisions (high 12-bit) - Expected 2796417.0, actual 2792321 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2796417.0, actual 2796161 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1820.7, actual 916 (0.50x) Testing collisions (low 25-38 bits) - Worst is 38 bits: 22/28 (0.77x) Testing collisions (low 12-bit) - Expected 2796417.0, actual 2792321 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2796417.0, actual 2796161 (1.00x) (-256) Testing distribution - Worst bias is the 18-bit window at bit 31 - 0.070%

Keyset 'Sparse' - 288-bit keys with up to 3 bits set - 3981553 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 3691.0, actual 1777 (0.48x) Testing collisions (high 26-39 bits) - Worst is 35 bits: 233/461 (0.51x) Testing collisions (high 12-bit) - Expected 3981553.0, actual 3977457 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 3981553.0, actual 3981297 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 3691.0, actual 1862 (0.50x) Testing collisions (low 26-39 bits) - Worst is 33 bits: 958/1845 (0.52x) Testing collisions (low 12-bit) - Expected 3981553.0, actual 3977457 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 3981553.0, actual 3981297 (1.00x) (-256) Testing distribution - Worst bias is the 19-bit window at bit 59 - 0.049%

Keyset 'Sparse' - 320-bit keys with up to 3 bits set - 5461601 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 6945.1, actual 3364 (0.48x) Testing collisions (high 26-40 bits) - Worst is 36 bits: 238/434 (0.55x) Testing collisions (high 12-bit) - Expected 5461601.0, actual 5457505 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 5461601.0, actual 5461345 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 6945.1, actual 3454 (0.50x) Testing collisions (low 26-40 bits) - Worst is 39 bits: 32/54 (0.59x) Testing collisions (low 12-bit) - Expected 5461601.0, actual 5457505 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 5461601.0, actual 5461345 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 24 - 0.075%

Keyset 'Sparse' - 384-bit keys with up to 3 bits set - 9437505 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 20737.4, actual 10373 (0.50x) Testing collisions (high 27-42 bits) - Worst is 39 bits: 82/162 (0.51x) Testing collisions (high 12-bit) - Expected 9437505.0, actual 9433409 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 9437505.0, actual 9437249 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 20737.4, actual 10353 (0.50x) Testing collisions (low 27-42 bits) - Worst is 37 bits: 350/648 (0.54x) Testing collisions (low 12-bit) - Expected 9437505.0, actual 9433409 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 9437505.0, actual 9437249 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 45 - 0.037%

Keyset 'Sparse' - 448-bit keys with up to 3 bits set - 14986273 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 52291.1, actual 26557 (0.51x) Testing collisions (high 28-43 bits) - Worst is 43 bits: 18/25 (0.70x) Testing collisions (high 12-bit) - Expected 14986273.0, actual 14982177 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 14986273.0, actual 14986017 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 52291.1, actual 26254 (0.50x) Testing collisions (low 28-43 bits) - Worst is 40 bits: 110/204 (0.54x) Testing collisions (low 12-bit) - Expected 14986273.0, actual 14982177 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 14986273.0, actual 14986017 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 30 - 0.024%

Keyset 'Sparse' - 512-bit keys with up to 3 bits set - 22370049 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 116512.9, actual 58180 (0.50x) Testing collisions (high 28-44 bits) - Worst is 38 bits: 954/1820 (0.52x) Testing collisions (high 12-bit) - Expected 22370049.0, actual 22365953 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 22370049.0, actual 22369793 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 116512.9, actual 58031 (0.50x) Testing collisions (low 28-44 bits) - Worst is 42 bits: 62/113 (0.54x) Testing collisions (low 12-bit) - Expected 22370049.0, actual 22365953 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 22370049.0, actual 22369793 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 12 - 0.015%

Keyset 'Sparse' - 640-bit keys with up to 3 bits set - 43691201 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 444455.3, actual 221987 (0.50x) Testing collisions (high 29-46 bits) - Worst is 46 bits: 16/27 (0.59x) Testing collisions (high 12-bit) - Expected 43691201.0, actual 43687105 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 43691201.0, actual 43690945 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 444455.3, actual 220831 (0.50x) Testing collisions (low 29-46 bits) - Worst is 46 bits: 17/27 (0.63x) Testing collisions (low 12-bit) - Expected 43691201.0, actual 43687105 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 43691201.0, actual 43690945 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 36 - 0.006%

Keyset 'Sparse' - 768-bit keys with up to 3 bits set - 75498113 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1327126.5, actual 659483 (0.50x) Testing collisions (high 30-48 bits) - Worst is 45 bits: 94/162 (0.58x) Testing collisions (high 12-bit) - Expected 75498113.0, actual 75494017 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 75498113.0, actual 75497857 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1327126.5, actual 658984 (0.50x) Testing collisions (low 30-48 bits) - Worst is 46 bits: 44/81 (0.54x) Testing collisions (low 12-bit) - Expected 75498113.0, actual 75494017 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 75498113.0, actual 75497857 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 17 - 0.005%

Keyset 'Sparse' - 896-bit keys with up to 2 bits set - 401857 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 37.6, actual 25 (0.66x) Testing collisions (high 22-32 bits) - Worst is 32 bits: 25/37 (0.66x) Testing collisions (high 12-bit) - Expected 401857.0, actual 397761 (0.99x) (-4096) Testing collisions (high 8-bit) - Expected 401857.0, actual 401601 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 37.6, actual 21 (0.56x) Testing collisions (low 22-32 bits) - Worst is 32 bits: 21/37 (0.56x) Testing collisions (low 12-bit) - Expected 401857.0, actual 397761 (0.99x) (-4096) Testing collisions (low 8-bit) - Expected 401857.0, actual 401601 (1.00x) (-256) Testing distribution - Worst bias is the 16-bit window at bit 46 - 0.246%

Keyset 'Sparse' - 1024-bit keys with up to 2 bits set - 524801 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 64.1, actual 29 (0.45x) Testing collisions (high 23-33 bits) - Worst is 33 bits: 16/32 (0.50x) Testing collisions (high 12-bit) - Expected 524801.0, actual 520705 (0.99x) (-4096) Testing collisions (high 8-bit) - Expected 524801.0, actual 524545 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 64.1, actual 36 (0.56x) Testing collisions (low 23-33 bits) - Worst is 31 bits: 73/128 (0.57x) Testing collisions (low 12-bit) - Expected 524801.0, actual 520705 (0.99x) (-4096) Testing collisions (low 8-bit) - Expected 524801.0, actual 524545 (1.00x) (-256) Testing distribution - Worst bias is the 16-bit window at bit 3 - 0.134%

Keyset 'Sparse' - 1280-bit keys with up to 2 bits set - 819841 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 156.5, actual 90 (0.58x) Testing collisions (high 23-34 bits) - Worst is 33 bits: 46/78 (0.59x) Testing collisions (high 12-bit) - Expected 819841.0, actual 815745 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 819841.0, actual 819585 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 156.5, actual 77 (0.49x) Testing collisions (low 23-34 bits) - Worst is 34 bits: 20/39 (0.51x) Testing collisions (low 12-bit) - Expected 819841.0, actual 815745 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 819841.0, actual 819585 (1.00x) (-256) Testing distribution - Worst bias is the 16-bit window at bit 59 - 0.088%

Keyset 'Sparse' - 1536-bit keys with up to 2 bits set - 1180417 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 324.4, actual 149 (0.46x) Testing collisions (high 24-36 bits) - Worst is 27 bits: 5327/10381 (0.51x) Testing collisions (high 12-bit) - Expected 1180417.0, actual 1176321 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1180417.0, actual 1180161 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 324.4, actual 156 (0.48x) Testing collisions (low 24-36 bits) - Worst is 36 bits: 14/20 (0.69x) Testing collisions (low 12-bit) - Expected 1180417.0, actual 1176321 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1180417.0, actual 1180161 (1.00x) (-256) Testing distribution - Worst bias is the 17-bit window at bit 19 - 0.144%

Keyset 'Sparse' - 2048-bit keys with up to 2 bits set - 2098177 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1025.0, actual 510 (0.50x) Testing collisions (high 25-37 bits) - Worst is 36 bits: 36/64 (0.56x) Testing collisions (high 12-bit) - Expected 2098177.0, actual 2094081 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2098177.0, actual 2097921 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1025.0, actual 476 (0.46x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 21/32 (0.66x) Testing collisions (low 12-bit) - Expected 2098177.0, actual 2094081 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2098177.0, actual 2097921 (1.00x) (-256) Testing distribution - Worst bias is the 18-bit window at bit 51 - 0.071%

Keyset 'Sparse' - 3072-bit keys with up to 2 bits set - 4720129 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 5187.4, actual 2606 (0.50x) Testing collisions (high 26-40 bits) - Worst is 40 bits: 17/20 (0.84x) Testing collisions (high 12-bit) - Expected 4720129.0, actual 4716033 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 4720129.0, actual 4719873 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 5187.4, actual 2634 (0.51x) Testing collisions (low 26-40 bits) - Worst is 32 bits: 2634/5187 (0.51x) Testing collisions (low 12-bit) - Expected 4720129.0, actual 4716033 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 4720129.0, actual 4719873 (1.00x) (-256) Testing distribution - Worst bias is the 19-bit window at bit 8 - 0.058%

Keyset 'Sparse' - 4096-bit keys with up to 2 bits set - 8390657 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 16392.0, actual 8018 (0.49x) Testing collisions (high 27-41 bits) - Worst is 38 bits: 128/256 (0.50x) Testing collisions (high 12-bit) - Expected 8390657.0, actual 8386561 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 8390657.0, actual 8390401 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 16392.0, actual 8195 (0.50x) Testing collisions (low 27-41 bits) - Worst is 33 bits: 4105/8196 (0.50x) Testing collisions (low 12-bit) - Expected 8390657.0, actual 8386561 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 8390657.0, actual 8390401 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 24 - 0.040%

Keyset 'Sparse' - 6144-bit keys with up to 2 bits set - 18877441 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 82971.0, actual 41090 (0.50x) Testing collisions (high 28-44 bits) - Worst is 43 bits: 28/40 (0.69x) Testing collisions (high 12-bit) - Expected 18877441.0, actual 18873345 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 18877441.0, actual 18877185 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 82971.0, actual 41897 (0.50x) Testing collisions (low 28-44 bits) - Worst is 44 bits: 16/20 (0.79x) Testing collisions (low 12-bit) - Expected 18877441.0, actual 18873345 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 18877441.0, actual 18877185 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 19 - 0.014%

Keyset 'Sparse' - 8192-bit keys with up to 2 bits set - 33558529 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 262208.0, actual 131017 (0.50x) Testing collisions (high 29-45 bits) - Worst is 45 bits: 21/32 (0.66x) Testing collisions (high 12-bit) - Expected 33558529.0, actual 33554433 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 33558529.0, actual 33558273 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 262208.0, actual 131024 (0.50x) Testing collisions (low 29-45 bits) - Worst is 45 bits: 25/32 (0.78x) Testing collisions (low 12-bit) - Expected 33558529.0, actual 33554433 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 33558529.0, actual 33558273 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 17 - 0.009%

Keyset 'Sparse' - 9992-bit keys with up to 2 bits set - 49925029 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 580332.4, actual 288932 (0.50x) Testing collisions (high 29-46 bits) - Worst is 37 bits: 9236/18135 (0.51x) Testing collisions (high 12-bit) - Expected 49925029.0, actual 49920933 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 49925029.0, actual 49924773 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 580332.4, actual 288298 (0.50x) Testing collisions (low 29-46 bits) - Worst is 46 bits: 23/35 (0.65x) Testing collisions (low 12-bit) - Expected 49925029.0, actual 49920933 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 49925029.0, actual 49924773 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.005%

[[[ Keyset 'Permutation' Tests ]]]

Combination Lowbits Tests: Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1337.5, actual 747 (0.56x) Testing collisions (high 25-38 bits) - Worst is 38 bits: 14/20 (0.67x) Testing collisions (high 12-bit) - Expected 2396744.0, actual 2392648 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2396744.0, actual 2396488 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1337.5, actual 693 (0.52x) Testing collisions (low 25-38 bits) - Worst is 32 bits: 693/1337 (0.52x) Testing collisions (low 12-bit) - Expected 2396744.0, actual 2392648 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2396744.0, actual 2396488 (1.00x) (-256) Testing distribution - Worst bias is the 18-bit window at bit 19 - 0.063%

Combination Highbits Tests Keyset 'Combination' - up to 7 blocks from a set of 8 - 2396744 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1337.5, actual 663 (0.50x) Testing collisions (high 25-38 bits) - Worst is 30 bits: 2763/5349 (0.52x) Testing collisions (high 12-bit) - Expected 2396744.0, actual 2392648 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2396744.0, actual 2396488 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1337.5, actual 646 (0.48x) Testing collisions (low 25-38 bits) - Worst is 29 bits: 5342/10699 (0.50x) Testing collisions (low 12-bit) - Expected 2396744.0, actual 2392648 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2396744.0, actual 2396488 (1.00x) (-256) Testing distribution - Worst bias is the 18-bit window at bit 59 - 0.069%

Combination Hi-Lo Tests: Keyset 'Combination' - up to 6 blocks from a set of 15 - 12204240 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 34678.6, actual 17371 (0.50x) Testing collisions (high 27-42 bits) - Worst is 42 bits: 24/33 (0.71x) Testing collisions (high 12-bit) - Expected 12204240.0, actual 12200144 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 12204240.0, actual 12203984 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 34678.6, actual 17250 (0.50x) Testing collisions (low 27-42 bits) - Worst is 42 bits: 24/33 (0.71x) Testing collisions (low 12-bit) - Expected 12204240.0, actual 12200144 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 12204240.0, actual 12203984 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.027%

Combination 0x8000000 Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32785 (0.50x) Testing collisions (high 28-43 bits) - Worst is 43 bits: 20/31 (0.63x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 33016 (0.50x) Testing collisions (low 28-43 bits) - Worst is 40 bits: 137/255 (0.54x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 9 - 0.015%

Combination 0x0000001 Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32813 (0.50x) Testing collisions (high 28-43 bits) - Worst is 35 bits: 4167/8191 (0.51x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32533 (0.50x) Testing collisions (low 28-43 bits) - Worst is 42 bits: 35/63 (0.55x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 58 - 0.026%

Combination 0x800000000000000 Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32514 (0.50x) Testing collisions (high 28-43 bits) - Worst is 38 bits: 531/1023 (0.52x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 33053 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 21/31 (0.66x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 48 - 0.021%

Combination 0x000000000000001 Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32827 (0.50x) Testing collisions (high 28-43 bits) - Worst is 41 bits: 76/127 (0.59x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32525 (0.50x) Testing collisions (low 28-43 bits) - Worst is 41 bits: 79/127 (0.62x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 51 - 0.018%

Combination 16-bytes [0-1] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32736 (0.50x) Testing collisions (high 28-43 bits) - Worst is 38 bits: 531/1023 (0.52x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32695 (0.50x) Testing collisions (low 28-43 bits) - Worst is 42 bits: 46/63 (0.72x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 12 - 0.016%

Combination 16-bytes [0-last] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32967 (0.50x) Testing collisions (high 28-43 bits) - Worst is 43 bits: 23/31 (0.72x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32737 (0.50x) Testing collisions (low 28-43 bits) - Worst is 37 bits: 1060/2047 (0.52x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 21 - 0.017%

Combination 32-bytes [0-1] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32930 (0.50x) Testing collisions (high 28-43 bits) - Worst is 42 bits: 38/63 (0.59x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32360 (0.49x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 16/31 (0.50x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.017%

Combination 32-bytes [0-last] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32836 (0.50x) Testing collisions (high 28-43 bits) - Worst is 36 bits: 2108/4095 (0.51x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32977 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 19/31 (0.59x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 7 - 0.022%

Combination 64-bytes [0-1] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32604 (0.50x) Testing collisions (high 28-43 bits) - Worst is 37 bits: 1049/2047 (0.51x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 33072 (0.50x) Testing collisions (low 28-43 bits) - Worst is 41 bits: 75/127 (0.59x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 39 - 0.023%

Combination 64-bytes [0-last] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32703 (0.50x) Testing collisions (high 28-43 bits) - Worst is 41 bits: 68/127 (0.53x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 33268 (0.51x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 22/31 (0.69x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 45 - 0.018%

Combination 128-bytes [0-1] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32592 (0.50x) Testing collisions (high 28-43 bits) - Worst is 43 bits: 19/31 (0.59x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32590 (0.50x) Testing collisions (low 28-43 bits) - Worst is 40 bits: 139/255 (0.54x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 45 - 0.019%

Combination 128-bytes [0-last] Tests: Keyset 'Combination' - up to 23 blocks from a set of 2 - 16777214 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 33075 (0.50x) Testing collisions (high 28-43 bits) - Worst is 40 bits: 136/255 (0.53x) Testing collisions (high 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32588 (0.50x) Testing collisions (low 28-43 bits) - Worst is 35 bits: 4148/8191 (0.51x) Testing collisions (low 12-bit) - Expected 16777214.0, actual 16773118 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777214.0, actual 16776958 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 53 - 0.016%

[[[ Keyset 'Window' Tests ]]]

Keyset 'Window' - 32-bit key, 25-bit window - 32 tests, 33554432 keys per test Window at 0 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 63 - 0.011% Window at 1 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 0 - 0.010% Window at 2 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 52 - 0.014% Window at 3 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 17 - 0.010% Window at 4 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 57 - 0.011% Window at 5 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 43 - 0.009% Window at 6 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 43 - 0.009% Window at 7 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 41 - 0.004% Window at 8 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 15 - 0.006% Window at 9 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 42 - 0.011% Window at 10 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 42 - 0.008% Window at 11 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 42 - 0.009% Window at 12 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 12 - 0.014% Window at 13 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 45 - 0.007% Window at 14 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 32 - 0.011% Window at 15 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 9 - 0.014% Window at 16 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 29 - 0.009% Window at 17 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 7 - 0.008% Window at 18 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 28 - 0.007% Window at 19 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 26 - 0.009% Window at 20 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 20 - 0.009% Window at 21 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 52 - 0.009% Window at 22 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 49 - 0.009% Window at 23 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 40 - 0.009% Window at 24 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 37 - 0.013% Window at 25 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 36 - 0.010% Window at 26 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 19-bit window at bit 46 - 0.010% Window at 27 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 36 - 0.012% Window at 28 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 41 - 0.007% Window at 29 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 12 - 0.008% Window at 30 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 23 - 0.011% Window at 31 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 42 - 0.010% Window at 32 - Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing distribution - Worst bias is the 20-bit window at bit 63 - 0.011%

[[[ Keyset 'Cyclic' Tests ]]]

Keyset 'Cyclic' - 8 cycles of 8 bytes - 1000000 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 232.8, actual 109 (0.47x) Testing collisions (high 24-35 bits) - Worst is 31 bits: 233/465 (0.50x) Testing collisions (high 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 232.8, actual 121 (0.52x) Testing collisions (low 24-35 bits) - Worst is 34 bits: 39/58 (0.67x) Testing collisions (low 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing distribution - Worst bias is the 17-bit window at bit 20 - 0.167%

Keyset 'Cyclic' - 8 cycles of 9 bytes - 1000000 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 232.8, actual 110 (0.47x) Testing collisions (high 24-35 bits) - Worst is 26 bits: 7350/14901 (0.49x) Testing collisions (high 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 232.8, actual 110 (0.47x) Testing collisions (low 24-35 bits) - Worst is 35 bits: 15/29 (0.52x) Testing collisions (low 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing distribution - Worst bias is the 16-bit window at bit 33 - 0.069%

Keyset 'Cyclic' - 8 cycles of 10 bytes - 1000000 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 232.8, actual 138 (0.59x) Testing collisions (high 24-35 bits) - Worst is 35 bits: 20/29 (0.69x) Testing collisions (high 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 232.8, actual 115 (0.49x) Testing collisions (low 24-35 bits) - Worst is 35 bits: 24/29 (0.82x) Testing collisions (low 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing distribution - Worst bias is the 17-bit window at bit 33 - 0.083%

Keyset 'Cyclic' - 8 cycles of 11 bytes - 1000000 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 232.8, actual 128 (0.55x) Testing collisions (high 24-35 bits) - Worst is 35 bits: 24/29 (0.82x) Testing collisions (high 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 232.8, actual 123 (0.53x) Testing collisions (low 24-35 bits) - Worst is 32 bits: 123/232 (0.53x) Testing collisions (low 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing distribution - Worst bias is the 17-bit window at bit 15 - 0.147%

Keyset 'Cyclic' - 8 cycles of 12 bytes - 1000000 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 232.8, actual 97 (0.42x) Testing collisions (high 24-35 bits) - Worst is 27 bits: 3794/7450 (0.51x) Testing collisions (high 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 232.8, actual 117 (0.50x) Testing collisions (low 24-35 bits) - Worst is 34 bits: 33/58 (0.57x) Testing collisions (low 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing distribution - Worst bias is the 17-bit window at bit 29 - 0.087%

Keyset 'Cyclic' - 8 cycles of 16 bytes - 1000000 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 232.8, actual 114 (0.49x) Testing collisions (high 24-35 bits) - Worst is 29 bits: 942/1862 (0.51x) Testing collisions (high 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 232.8, actual 130 (0.56x) Testing collisions (low 24-35 bits) - Worst is 32 bits: 130/232 (0.56x) Testing collisions (low 12-bit) - Expected 1000000.0, actual 995904 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 1000000.0, actual 999744 (1.00x) (-256) Testing distribution - Worst bias is the 17-bit window at bit 59 - 0.132%

[[[ Keyset 'TwoBytes' Tests ]]]

Keyset 'TwoBytes' - up-to-4-byte keys, 652545 total keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 99.1, actual 41 (0.41x) Testing collisions (high 23-34 bits) - Worst is 30 bits: 211/396 (0.53x) Testing collisions (high 12-bit) - Expected 652545.0, actual 648449 (0.99x) (-4096) Testing collisions (high 8-bit) - Expected 652545.0, actual 652289 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 99.1, actual 49 (0.49x) Testing collisions (low 23-34 bits) - Worst is 33 bits: 25/49 (0.50x) Testing collisions (low 12-bit) - Expected 652545.0, actual 648449 (0.99x) (-4096) Testing collisions (low 8-bit) - Expected 652545.0, actual 652289 (1.00x) (-256) Testing distribution - Worst bias is the 16-bit window at bit 17 - 0.133%

Keyset 'TwoBytes' - up-to-8-byte keys, 5471025 total keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 6969.1, actual 3529 (0.51x) Testing collisions (high 26-40 bits) - Worst is 40 bits: 17/27 (0.62x) Testing collisions (high 12-bit) - Expected 5471025.0, actual 5466929 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 5471025.0, actual 5470769 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 6969.1, actual 3576 (0.51x) Testing collisions (low 26-40 bits) - Worst is 39 bits: 43/54 (0.79x) Testing collisions (low 12-bit) - Expected 5471025.0, actual 5466929 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 5471025.0, actual 5470769 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 25 - 0.063%

Keyset 'TwoBytes' - up-to-12-byte keys, 18616785 total keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 80695.5, actual 40237 (0.50x) Testing collisions (high 28-43 bits) - Worst is 31 bits: 80689/161391 (0.50x) Testing collisions (high 12-bit) - Expected 18616785.0, actual 18612689 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 18616785.0, actual 18616529 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 80695.5, actual 40591 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 26/39 (0.66x) Testing collisions (low 12-bit) - Expected 18616785.0, actual 18612689 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 18616785.0, actual 18616529 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 54 - 0.021%

Keyset 'TwoBytes' - up-to-16-byte keys, 44251425 total keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 455926.3, actual 227675 (0.50x) Testing collisions (high 29-46 bits) - Worst is 46 bits: 19/27 (0.68x) Testing collisions (high 12-bit) - Expected 44251425.0, actual 44247329 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 44251425.0, actual 44251169 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 455926.3, actual 227194 (0.50x) Testing collisions (low 29-46 bits) - Worst is 46 bits: 16/27 (0.57x) Testing collisions (low 12-bit) - Expected 44251425.0, actual 44247329 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 44251425.0, actual 44251169 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 63 - 0.008%

Keyset 'TwoBytes' - up-to-20-byte keys, 86536545 total keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1743569.4, actual 866431 (0.50x) Testing collisions (high 30-48 bits) - Worst is 46 bits: 56/106 (0.53x) Testing collisions (high 12-bit) - Expected 86536545.0, actual 86532449 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 86536545.0, actual 86536289 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1743569.4, actual 865780 (0.50x) Testing collisions (low 30-48 bits) - Worst is 48 bits: 16/26 (0.60x) Testing collisions (low 12-bit) - Expected 86536545.0, actual 86532449 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 86536545.0, actual 86536289 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 36 - 0.002%

Keyset 'TwoBytes' - up-to-24-byte keys, 149633745 total keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 5213138.1, actual 2577858 (0.49x) Testing collisions (high 31-49 bits) - Worst is 48 bits: 43/79 (0.54x) Testing collisions (high 12-bit) - Expected 149633745.0, actual 149629649 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 149633745.0, actual 149633489 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 5213138.1, actual 2575994 (0.49x) Testing collisions (low 31-49 bits) - Worst is 49 bits: 25/39 (0.63x) Testing collisions (low 12-bit) - Expected 149633745.0, actual 149629649 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 149633745.0, actual 149633489 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 55 - 0.002%

[[[ Keyset 'Text' Tests ]]]

Keyset 'Text' - keys of form "Foo[XXXX]Bar" - 14776336 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 50836.3, actual 25367 (0.50x) Testing collisions (high 28-43 bits) - Worst is 37 bits: 793/1588 (0.50x) Testing collisions (high 12-bit) - Expected 14776336.0, actual 14772240 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 14776336.0, actual 14776080 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 50836.3, actual 25414 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 17/24 (0.68x) Testing collisions (low 12-bit) - Expected 14776336.0, actual 14772240 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 14776336.0, actual 14776080 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 60 - 0.018%

Keyset 'Text' - keys of form "FooBar[XXXX]" - 14776336 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 50836.3, actual 25306 (0.50x) Testing collisions (high 28-43 bits) - Worst is 38 bits: 423/794 (0.53x) Testing collisions (high 12-bit) - Expected 14776336.0, actual 14772240 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 14776336.0, actual 14776080 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 50836.3, actual 25497 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 16/24 (0.64x) Testing collisions (low 12-bit) - Expected 14776336.0, actual 14772240 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 14776336.0, actual 14776080 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 40 - 0.019%

Keyset 'Text' - keys of form "[XXXX]FooBar" - 14776336 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 50836.3, actual 25454 (0.50x) Testing collisions (high 28-43 bits) - Worst is 43 bits: 16/24 (0.64x) Testing collisions (high 12-bit) - Expected 14776336.0, actual 14772240 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 14776336.0, actual 14776080 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 50836.3, actual 25210 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 13/24 (0.52x) Testing collisions (low 12-bit) - Expected 14776336.0, actual 14772240 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 14776336.0, actual 14776080 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 60 - 0.025%

[[[ Keyset 'Zeroes' Tests ]]]

Keyset 'Zeroes' - 204800 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 9.8, actual 2 (0.20x) Testing collisions (high 21-30 bits) - Worst is 24 bits: 1272/2499 (0.51x) Testing collisions (high 12-bit) - Expected 204800.0, actual 200704 (0.98x) Testing collisions (high 8-bit) - Expected 204800.0, actual 204544 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 9.8, actual 9 (0.92x) Testing collisions (low 21-30 bits) - Worst is 27 bits: 158/312 (0.51x) Testing collisions (low 12-bit) - Expected 204800.0, actual 200704 (0.98x) Testing collisions (low 8-bit) - Expected 204800.0, actual 204544 (1.00x) (-256) Testing distribution - Worst bias is the 15-bit window at bit 46 - 0.275%

[[[ Keyset 'Seed' Tests ]]]

Keyset 'Seed' - 5000000 keys Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 5820.8, actual 2983 (0.51x) Testing collisions (high 26-40 bits) - Worst is 35 bits: 407/727 (0.56x) Testing collisions (high 12-bit) - Expected 5000000.0, actual 4995904 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 5000000.0, actual 4999744 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 5820.8, actual 2889 (0.50x) Testing collisions (low 26-40 bits) - Worst is 40 bits: 15/22 (0.66x) Testing collisions (low 12-bit) - Expected 5000000.0, actual 4995904 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 5000000.0, actual 4999744 (1.00x) (-256) Testing distribution - Worst bias is the 19-bit window at bit 8 - 0.030%

[[[ Keyset 'PerlinNoise' Tests ]]]

Testing 16777216 coordinates (L2) : Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32985 (0.50x) Testing collisions (high 28-43 bits) - Worst is 42 bits: 40/63 (0.63x) Testing collisions (high 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32841 (0.50x) Testing collisions (low 28-43 bits) - Worst is 39 bits: 259/511 (0.51x) Testing collisions (low 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 9 - 0.017%

Testing 16777216 coordinates (L4) : Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32746 (0.50x) Testing collisions (high 28-43 bits) - Worst is 35 bits: 4114/8191 (0.50x) Testing collisions (high 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32519 (0.50x) Testing collisions (low 28-43 bits) - Worst is 38 bits: 517/1023 (0.50x) Testing collisions (low 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 30 - 0.019%

Testing 16777216 coordinates (L8) : Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32975 (0.50x) Testing collisions (high 28-43 bits) - Worst is 43 bits: 20/31 (0.63x) Testing collisions (high 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32772 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 17/31 (0.53x) Testing collisions (low 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 48 - 0.017%

Testing 16777216 coordinates (L16) : Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 65536.0, actual 32811 (0.50x) Testing collisions (high 28-43 bits) - Worst is 32 bits: 32811/65535 (0.50x) Testing collisions (high 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 65536.0, actual 32703 (0.50x) Testing collisions (low 28-43 bits) - Worst is 43 bits: 18/31 (0.56x) Testing collisions (low 12-bit) - Expected 16777216.0, actual 16773120 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 16777216.0, actual 16776960 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 23 - 0.022%

[[[ Diff '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

[[[ DiffDist 'Differential Distribution' Tests ]]]

Testing bit 0 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 483 (0.47x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 19/31 (0.59x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 494 (0.48x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 258/511 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 1 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 459 (0.45x) Testing collisions (high 25-37 bits) - Worst is 29 bits: 4146/8191 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 497 (0.49x) Testing collisions (low 25-37 bits) - Worst is 28 bits: 8254/16383 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 2 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 500 (0.49x) Testing collisions (high 25-37 bits) - Worst is 27 bits: 16272/32767 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 487 (0.48x) Testing collisions (low 25-37 bits) - Worst is 26 bits: 32388/65535 (0.49x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 3 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 503 (0.49x) Testing collisions (high 25-37 bits) - Worst is 30 bits: 2081/4095 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 526 (0.51x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 282/511 (0.55x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 4 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 472 (0.46x) Testing collisions (high 25-37 bits) - Worst is 26 bits: 32400/65535 (0.49x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 522 (0.51x) Testing collisions (low 25-37 bits) - Worst is 31 bits: 1057/2047 (0.52x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 5 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 466 (0.46x) Testing collisions (high 25-37 bits) - Worst is 28 bits: 8284/16383 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 521 (0.51x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 24/31 (0.75x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 6 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 482 (0.47x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 19/31 (0.59x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 486 (0.47x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 16/31 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 7 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 424 (0.41x) Testing collisions (high 25-37 bits) - Worst is 29 bits: 4124/8191 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 567 (0.55x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 25/31 (0.78x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 8 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 521 (0.51x) Testing collisions (high 25-37 bits) - Worst is 33 bits: 263/511 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 529 (0.52x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 9 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 507 (0.50x) Testing collisions (high 25-37 bits) - Worst is 28 bits: 8193/16383 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 480 (0.47x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 22/31 (0.69x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 10 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 501 (0.49x) Testing collisions (high 25-37 bits) - Worst is 29 bits: 4095/8191 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 534 (0.52x) Testing collisions (low 25-37 bits) - Worst is 32 bits: 534/1023 (0.52x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 11 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 499 (0.49x) Testing collisions (high 25-37 bits) - Worst is 29 bits: 4107/8191 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 519 (0.51x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 269/511 (0.53x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 12 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 526 (0.51x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 72/127 (0.56x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 490 (0.48x) Testing collisions (low 25-37 bits) - Worst is 34 bits: 129/255 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 13 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 519 (0.51x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 26/31 (0.81x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 514 (0.50x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 21/31 (0.66x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 14 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 515 (0.50x) Testing collisions (high 25-37 bits) - Worst is 33 bits: 268/511 (0.52x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 507 (0.50x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 257/511 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 15 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 502 (0.49x) Testing collisions (high 25-37 bits) - Worst is 36 bits: 35/63 (0.55x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 478 (0.47x) Testing collisions (low 25-37 bits) - Worst is 26 bits: 32341/65535 (0.49x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 16 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 515 (0.50x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 21/31 (0.66x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 509 (0.50x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 36/63 (0.56x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 17 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 509 (0.50x) Testing collisions (high 25-37 bits) - Worst is 36 bits: 39/63 (0.61x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 490 (0.48x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 32/63 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 18 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 527 (0.51x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 76/127 (0.59x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 494 (0.48x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 44/63 (0.69x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 19 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 492 (0.48x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 17/31 (0.53x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 488 (0.48x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 18/31 (0.56x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 20 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 504 (0.49x) Testing collisions (high 25-37 bits) - Worst is 27 bits: 16558/32767 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 518 (0.51x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 40/63 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 21 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 524 (0.51x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 499 (0.49x) Testing collisions (low 25-37 bits) - Worst is 29 bits: 4167/8191 (0.51x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 22 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 514 (0.50x) Testing collisions (high 25-37 bits) - Worst is 31 bits: 1033/2047 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 497 (0.49x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 36/63 (0.56x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 23 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 493 (0.48x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 73/127 (0.57x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 509 (0.50x) Testing collisions (low 25-37 bits) - Worst is 35 bits: 67/127 (0.52x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 24 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 518 (0.51x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 21/31 (0.66x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 507 (0.50x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 38/63 (0.59x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 25 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 514 (0.50x) Testing collisions (high 25-37 bits) - Worst is 31 bits: 1037/2047 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 512 (0.50x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 22/31 (0.69x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 26 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 489 (0.48x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 17/31 (0.53x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 514 (0.50x) Testing collisions (low 25-37 bits) - Worst is 31 bits: 1046/2047 (0.51x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 27 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 520 (0.51x) Testing collisions (high 25-37 bits) - Worst is 28 bits: 8345/16383 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 542 (0.53x) Testing collisions (low 25-37 bits) - Worst is 34 bits: 147/255 (0.57x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 28 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 492 (0.48x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 22/31 (0.69x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 491 (0.48x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 17/31 (0.53x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 29 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 495 (0.48x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 68/127 (0.53x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 490 (0.48x) Testing collisions (low 25-37 bits) - Worst is 35 bits: 66/127 (0.52x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 30 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 541 (0.53x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 71/127 (0.55x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 524 (0.51x) Testing collisions (low 25-37 bits) - Worst is 34 bits: 144/255 (0.56x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 31 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 539 (0.53x) Testing collisions (high 25-37 bits) - Worst is 32 bits: 539/1023 (0.53x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 531 (0.52x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 272/511 (0.53x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 32 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 545 (0.53x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 496 (0.48x) Testing collisions (low 25-37 bits) - Worst is 29 bits: 4131/8191 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 33 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 475 (0.46x) Testing collisions (high 25-37 bits) - Worst is 28 bits: 8267/16383 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 520 (0.51x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 35/63 (0.55x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 34 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 515 (0.50x) Testing collisions (high 25-37 bits) - Worst is 34 bits: 166/255 (0.65x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 566 (0.55x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 40/63 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 35 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 517 (0.50x) Testing collisions (high 25-37 bits) - Worst is 31 bits: 1043/2047 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 547 (0.53x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 19/31 (0.59x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 36 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 486 (0.47x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 25/31 (0.78x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 529 (0.52x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 21/31 (0.66x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 37 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 518 (0.51x) Testing collisions (high 25-37 bits) - Worst is 33 bits: 265/511 (0.52x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 534 (0.52x) Testing collisions (low 25-37 bits) - Worst is 35 bits: 73/127 (0.57x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 38 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 550 (0.54x) Testing collisions (high 25-37 bits) - Worst is 32 bits: 550/1023 (0.54x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 521 (0.51x) Testing collisions (low 25-37 bits) - Worst is 32 bits: 521/1023 (0.51x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 39 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 519 (0.51x) Testing collisions (high 25-37 bits) - Worst is 33 bits: 275/511 (0.54x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 526 (0.51x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 270/511 (0.53x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 40 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 529 (0.52x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 80/127 (0.63x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 534 (0.52x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 277/511 (0.54x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 41 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 544 (0.53x) Testing collisions (high 25-37 bits) - Worst is 33 bits: 296/511 (0.58x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 530 (0.52x) Testing collisions (low 25-37 bits) - Worst is 32 bits: 530/1023 (0.52x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 42 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 535 (0.52x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 69/127 (0.54x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 526 (0.51x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 43 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 505 (0.49x) Testing collisions (high 25-37 bits) - Worst is 31 bits: 1038/2047 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 497 (0.49x) Testing collisions (low 25-37 bits) - Worst is 27 bits: 16401/32767 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 44 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 484 (0.47x) Testing collisions (high 25-37 bits) - Worst is 35 bits: 72/127 (0.56x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 529 (0.52x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 42/63 (0.66x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 45 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 499 (0.49x) Testing collisions (high 25-37 bits) - Worst is 34 bits: 127/255 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 486 (0.47x) Testing collisions (low 25-37 bits) - Worst is 31 bits: 1029/2047 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 46 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 527 (0.51x) Testing collisions (high 25-37 bits) - Worst is 34 bits: 143/255 (0.56x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 540 (0.53x) Testing collisions (low 25-37 bits) - Worst is 35 bits: 83/127 (0.65x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 47 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 468 (0.46x) Testing collisions (high 25-37 bits) - Worst is 28 bits: 8149/16383 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 513 (0.50x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 48 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 514 (0.50x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 481 (0.47x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 40/63 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 49 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 522 (0.51x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 527 (0.51x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 18/31 (0.56x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 50 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 513 (0.50x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 18/31 (0.56x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 511 (0.50x) Testing collisions (low 25-37 bits) - Worst is 30 bits: 2055/4095 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 51 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 509 (0.50x) Testing collisions (high 25-37 bits) - Worst is 34 bits: 142/255 (0.55x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 508 (0.50x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 17/31 (0.53x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 52 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 519 (0.51x) Testing collisions (high 25-37 bits) - Worst is 36 bits: 40/63 (0.63x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 500 (0.49x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 18/31 (0.56x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 53 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 484 (0.47x) Testing collisions (high 25-37 bits) - Worst is 30 bits: 2028/4095 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 515 (0.50x) Testing collisions (low 25-37 bits) - Worst is 30 bits: 2081/4095 (0.51x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 54 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 498 (0.49x) Testing collisions (high 25-37 bits) - Worst is 28 bits: 8269/16383 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 490 (0.48x) Testing collisions (low 25-37 bits) - Worst is 29 bits: 4087/8191 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 55 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 497 (0.49x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 18/31 (0.56x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 477 (0.47x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 22/31 (0.69x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 56 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 473 (0.46x) Testing collisions (high 25-37 bits) - Worst is 29 bits: 4158/8191 (0.51x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 525 (0.51x) Testing collisions (low 25-37 bits) - Worst is 32 bits: 525/1023 (0.51x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 57 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 516 (0.50x) Testing collisions (high 25-37 bits) - Worst is 34 bits: 136/255 (0.53x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 491 (0.48x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 36/63 (0.56x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 58 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 500 (0.49x) Testing collisions (high 25-37 bits) - Worst is 34 bits: 135/255 (0.53x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 526 (0.51x) Testing collisions (low 25-37 bits) - Worst is 36 bits: 37/63 (0.58x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 59 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 501 (0.49x) Testing collisions (high 25-37 bits) - Worst is 27 bits: 16404/32767 (0.50x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 534 (0.52x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 60 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 502 (0.49x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 17/31 (0.53x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 530 (0.52x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 20/31 (0.63x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 61 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 528 (0.52x) Testing collisions (high 25-37 bits) - Worst is 37 bits: 24/31 (0.75x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 486 (0.47x) Testing collisions (low 25-37 bits) - Worst is 37 bits: 16/31 (0.50x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 62 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 506 (0.49x) Testing collisions (high 25-37 bits) - Worst is 36 bits: 35/63 (0.55x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 522 (0.51x) Testing collisions (low 25-37 bits) - Worst is 34 bits: 148/255 (0.58x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

Testing bit 63 Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 1024.0, actual 529 (0.52x) Testing collisions (high 25-37 bits) - Worst is 36 bits: 35/63 (0.55x) Testing collisions (high 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 1024.0, actual 534 (0.52x) Testing collisions (low 25-37 bits) - Worst is 33 bits: 282/511 (0.55x) Testing collisions (low 12-bit) - Expected 2097152.0, actual 2093056 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 2097152.0, actual 2096896 (1.00x) (-256)

[[[ MomentChi2 Tests ]]]

Analyze hashes produced from a serie of linearly increasing numbers of 32-bit, using a step of 3 ... Target values to approximate : 38918200.000000 - 410450.000000 Popcount 1 stats : 38918576.876460 - 410458.475595 Popcount 0 stats : 38919512.783010 - 410499.833480 MomentChi2 for bits 1 : 0.173023 MomentChi2 for bits 0 : 2.09927

Derivative stats (transition from 2 consecutive values) : Popcount 1 stats : 38919065.213493 - 410450.263254 Popcount 0 stats : 38918640.533630 - 410441.607555 MomentChi2 for deriv b1 : 0.911919 MomentChi2 for deriv b0 : 0.236414

Great !!

Analyze hashes produced from a serie of linearly increasing numbers of 64-bit, using a step of 3 ... Target values to approximate : 38918200.000000 - 410450.000000 Popcount 1 stats : 38918549.443290 - 410464.872468 Popcount 0 stats : 38918964.124552 - 410435.538757 MomentChi2 for bits 1 : 0.148749 MomentChi2 for bits 0 : 0.711288

Derivative stats (transition from 2 consecutive values) : Popcount 1 stats : 38918244.553152 - 410455.467637 Popcount 0 stats : 38919810.415210 - 410487.446393 MomentChi2 for deriv b1 : 0.00241804 MomentChi2 for deriv b0 : 3.15912

Great !!

Analyze hashes produced from a serie of linearly increasing numbers of 128-bit, using a step of 3 ... Target values to approximate : 38918200.000000 - 410450.000000 Popcount 1 stats : 38919291.002634 - 410462.798838 Popcount 0 stats : 38918630.682382 - 410466.112242 MomentChi2 for bits 1 : 1.44996 MomentChi2 for bits 0 : 0.225952

Derivative stats (transition from 2 consecutive values) : Popcount 1 stats : 38919642.565093 - 410454.931269 Popcount 0 stats : 38917894.912196 - 410439.924020 MomentChi2 for deriv b1 : 2.535 MomentChi2 for deriv b0 : 0.113387

Great !!

[[[ Prng Tests ]]]

Generating 33554432 random numbers : Testing collisions ( 64-bit) - Expected 0.0, actual 0 (0.00x) Testing collisions (high 32-bit) - Expected 262144.0, actual 130837 (0.50x) Testing collisions (high 29-45 bits) - Worst is 43 bits: 79/127 (0.62x) Testing collisions (high 12-bit) - Expected 33554432.0, actual 33550336 (1.00x) (-4096) Testing collisions (high 8-bit) - Expected 33554432.0, actual 33554176 (1.00x) (-256) Testing collisions (low 32-bit) - Expected 262144.0, actual 130857 (0.50x) Testing collisions (low 29-45 bits) - Worst is 44 bits: 33/63 (0.52x) Testing collisions (low 12-bit) - Expected 33554432.0, actual 33550336 (1.00x) (-4096) Testing collisions (low 8-bit) - Expected 33554432.0, actual 33554176 (1.00x) (-256) Testing distribution - Worst bias is the 20-bit window at bit 3 - 0.012%

Input vcode 0x00000001, Output vcode 0x00000001, Result vcode 0x00000001 Verification value is 0x00000001 - Testing took -819.034210 seconds

wangyi-fudan commented 4 years ago

Could you re-run smhasher tests and speed tests with the condom to see the speed and quality differences? with condom, the short key speed is not that great, just 25% a bit faster than xxh3. the bulk speed is the same. in fact this version's bulk speed is not great, which is trade for short key speed and code sizes. It depends on tasks.

wangyi-fudan commented 4 years ago

If you hack xxHash's benchmark code: benchfn.c, forcing it directly call wyhash or other hash, you will see something amazing.

dumblob commented 4 years ago

in fact this version's bulk speed is not great, which is trade for short key speed and code sizes. It depends on tasks.

Of course. The point was, that the older wyhash versions were just a tiny bit slower for shorter keys than the wyhash gamma, but way faster in bulk speed than the current wyhash gamma.

Code size might be sometimes important, but for a general purpose hash function I don't think it matters in practice at all. Either there is a hash function in 20 characters one can easily remember for writing tiny/embedded/throwaway apps or there is no limit - and I think wyhash definitely targets the latter :wink:.

If you hack xxHash's benchmark code: benchfn.c, forcing it directly call wyhash or other hash, you will see something amazing.

Yeah, that's true. It really is amazing. Still in my eyes it doesn't solve the current weakest point of wyhash gamma which is bulk speed being ~2.3x lower than the xxh3 and nearly that much lower than certain older wyhash versions. It actually amplifies this weakness :cry:.

wangyi-fudan commented 4 years ago

yeah, the bulk speed make two ecological positions for both wyhash and xxh3 :-) I say xxh3 is great, but I am focusing on short keys.

wangyi-fudan commented 4 years ago

Today, with g++-9, the new record is here.

/usr/share/dict/words hash function short hash/us bulk_256B GB/s bulk_64KB GB/s
wyhash 442.49 13.16 9.64
xxh3_avx2 146.15 9.23 45.34
xxHash64 82.07 10.89 14.71
t1ha2_atonce 116.48 12.98 17.63

To make it crediable, I attach the simplest benchmark.cpp here:

#include    <sys/time.h>
#include    <iostream>
#include    <fstream>
#include    <vector>
#include    "xxHash/xxhash.c"
#include    "t1ha/t1ha.h"
#include    "wyhash.h"
using   namespace   std;
struct  wy{ size_t  operator()(const    string  &s, uint64_t seed)const{    return  wyhash(s.c_str(),s.size(),seed,_wyp);   }};
struct  x3{ size_t  operator()(const    string  &s, uint64_t seed)const{    return  XXH3_64bits_withSeed(s.c_str(),s.size(),seed);  }};
struct  xx{ size_t  operator()(const    string  &s, uint64_t seed)const{    return  XXH64(s.c_str(),s.size(),seed); }};
struct  t1{ size_t  operator()(const    string  &s, uint64_t seed)const{    return  t1ha2_atonce(s.c_str(),s.size(),seed);  }};

vector<string>  v;  
template <class Hasher>
uint64_t    bench_hash(const    char    *name){
    Hasher  h;  string  s;  timeval beg,    end;    
    uint64_t    dummy=0;    const   uint64_t    N=v.size(), R=0x1000;
    cerr.precision(2);  cerr.setf(ios::fixed);  cerr<<'|'<<name<<(strlen(name)<8?"\t\t|":"\t|");

    gettimeofday(&beg,NULL);
    for(size_t  r=0;    r<R;    r++)    for(size_t  i=0;    i<N;    i++)    dummy+=h(v[i],r);
    gettimeofday(&end,NULL);
    cerr<<1e-6*R*N/(end.tv_sec-beg.tv_sec+1e-6*(end.tv_usec-beg.tv_usec))<<"\t\t|";

    s.resize(1<<8);
    gettimeofday(&beg,NULL);
    for(size_t  r=0;    r<(R<<14);    r++)  dummy+=h(s,r);
    gettimeofday(&end,NULL);
    cerr<<1e-9*(R<<14)*s.size()/(end.tv_sec-beg.tv_sec+1e-6*(end.tv_usec-beg.tv_usec))<<"\t\t|";

    s.resize(1<<16);
    gettimeofday(&beg,NULL);
    for(size_t  r=0;    r<(R<<6);    r++)   dummy+=h(s,r);
    gettimeofday(&end,NULL);
    cerr<<1e-9*(R<<6)*s.size()/(end.tv_sec-beg.tv_sec+1e-6*(end.tv_usec-beg.tv_usec))<<"\t\t|\n";
    return  dummy;
}

int main(void){
    string  file="/usr/share/dict/words", s;
    ifstream    fi(file.c_str());
    for(fi>>s;  !fi.eof();  fi>>s)  if(s.size())    v.push_back(s);
    fi.close();
    //shuffle the array to benchmark random access
    for(size_t  i=v.size()-1;   i;  i--)    swap(v[i],v[rand()%(i+1)]);
    uint64_t    r=0;
    cerr<<file<<'\n';
    cerr<<"|hash function\t|short hash/us\t|bulk_256B GB/s\t|bulk_64KB GB/s\t|\n";
    cerr<<"|----\t\t|----\t\t|----\t\t|----\t\t|\n";
    r+=bench_hash<wy>("wyhash");
    r+=bench_hash<x3>("xxh3_avx2");
    r+=bench_hash<xx>("xxHash64");
    r+=bench_hash<t1>("t1ha2_atonce");
    return  r;
}
rurban commented 4 years ago

Just beware that gcc-9 still has too many bugs in its string optimizations. 9.3 fixed one for me, but it's still too broken. You really have to check extensively for correctness against their broken optimizations.

wangyi-fudan commented 4 years ago

today's effort makes bulk speed high.

g++-9 benchmark.cpp t1ha/src/t1ha2.c -o benchmark -Ofast -s -Wall -march=native /usr/share/dict/words hash function short hash/us bulk_256B GB/s bulk_64KB GB/s
wyhash 398.53 19.16 25.80
wyhash_safe 183.30 18.40 23.41
wyhash_moresafe 187.36 12.39 17.39
xxh3 152.79 8.12 13.05
xxh3_sse 153.17 11.77 27.17
xxh3_avx2 146.80 9.74 45.35
xxHash64 83.32 10.89 14.72
t1ha2_atonce 116.54 12.97 17.62
dumblob commented 4 years ago

This looks very promising (I suppose wyhash_safe means defining WYHASH_SAFE_MUM to 1 and wyhash_moresafe means defining both WYHASH_SAFE_READ to 1 and WYHASH_SAFE_MUM to 1). Good job and thanks!

wangyi-fudan commented 4 years ago

wyhash_safe means WYHASH_SAFE_READ (not one-shot read outside buffer), wyhash_moresafe means both WYHASH_SAFE_READ+WYHASH_SAFE_MUM (no blind mul)

rurban commented 4 years ago

I'll still need a few days, my benchmark machine is busy fuzzing