-
-
Save vstakhov/b58b855532a424cd634b6c7ea7baa1b9 to your computer and use it in GitHub Desktop.
#include <stdint.h> | |
#include <string.h> | |
#include <assert.h> | |
static inline uint64_t | |
diffuse(uint64_t val) | |
{ | |
uint64_t a, b; | |
val *= 0x6eed0e9da4d94a4fULL; | |
a = val >> 32; | |
b = val >> 60; | |
val ^= a >> b; | |
val *= 0x6eed0e9da4d94a4fULL; | |
return val; | |
} | |
void sea_hash_test(const void *key, int len, uint32_t seed, void *out) { | |
uint64_t a, b, c, d; | |
uint64_t s = seed; | |
uint64_t *p; | |
unsigned char pad[8] = {0}; | |
a = 0x16f11fe89b0d677cULL ^ s; | |
b = 0xb480a793d8e6c86cULL; | |
c = 0x6fe2e5aaf078ebc9ULL; | |
d = 0x14f994a4c5259381ULL; | |
p = (uint64_t *)key; | |
while (len >= 32) { | |
a ^= *p++; | |
b ^= *p++; | |
c ^= *p++; | |
d ^= *p++; | |
a = diffuse(a); | |
b = diffuse(b); | |
c = diffuse(c); | |
d = diffuse(d); | |
len -= 32; | |
} | |
switch (len) { | |
case 25 ... 31: | |
a ^= *p++; | |
b ^= *p++; | |
c ^= *p++; | |
memcpy(pad, p, len - 24); | |
d ^= *(uint64_t *)pad; | |
a = diffuse(a); | |
b = diffuse(b); | |
c = diffuse(c); | |
d = diffuse(d); | |
break; | |
case 24: | |
a ^= *p++; | |
b ^= *p++; | |
c ^= *p++; | |
a = diffuse(a); | |
b = diffuse(b); | |
c = diffuse(c); | |
break; | |
case 17 ... 23: | |
a ^= *p++; | |
b ^= *p++; | |
memcpy(pad, p, len - 16); | |
c ^= *(uint64_t *)pad; | |
a = diffuse(a); | |
b = diffuse(b); | |
c = diffuse(c); | |
break; | |
case 16: | |
a ^= *p++; | |
b ^= *p++; | |
a = diffuse(a); | |
b = diffuse(b); | |
break; | |
case 9 ... 15: | |
a ^= *p++; | |
memcpy(pad, p, len - 8); | |
b ^= *(uint64_t *)pad; | |
a = diffuse(a); | |
b = diffuse(b); | |
break; | |
case 8: | |
a ^= *p++; | |
a = diffuse(a); | |
break; | |
case 1 ... 7: | |
memcpy(pad, p, len); | |
a ^= *(uint64_t *)pad; | |
a = diffuse(a); | |
break; | |
case 0: | |
break; | |
default: | |
assert(0); | |
} | |
a ^= b; | |
c ^= d; | |
a ^= c; | |
a ^= (uint64_t)len; | |
uint64_t r = diffuse(a); | |
memcpy(out, &r, 8); | |
} |
--- Testing xxHash64 "xxHash, 64-bit"
[[[ Sanity Tests ]]]
Verification value 0x024B7CF4 : PASS
Running sanity check 1 ..........PASS
Running AppendedZeroesTest..........PASS
[[[ Speed Tests ]]]
Bulk speed test - 262144-byte keys
Alignment 7 - 5.843 bytes/cycle - 16717.48 MiB/sec @ 3 ghz
Alignment 6 - 6.135 bytes/cycle - 17553.16 MiB/sec @ 3 ghz
Alignment 5 - 6.018 bytes/cycle - 17217.11 MiB/sec @ 3 ghz
Alignment 4 - 5.859 bytes/cycle - 16761.48 MiB/sec @ 3 ghz
Alignment 3 - 6.135 bytes/cycle - 17551.65 MiB/sec @ 3 ghz
Alignment 2 - 6.072 bytes/cycle - 17372.29 MiB/sec @ 3 ghz
Alignment 1 - 5.897 bytes/cycle - 16871.33 MiB/sec @ 3 ghz
Alignment 0 - 6.082 bytes/cycle - 17401.26 MiB/sec @ 3 ghz
Average - 6.005 bytes/cycle - 17180.72 MiB/sec @ 3 ghz
Small key speed test - 1-byte keys - 20.70 cycles/hash
Small key speed test - 2-byte keys - 24.00 cycles/hash
Small key speed test - 3-byte keys - 27.95 cycles/hash
Small key speed test - 4-byte keys - 21.80 cycles/hash
Small key speed test - 5-byte keys - 24.84 cycles/hash
Small key speed test - 6-byte keys - 27.23 cycles/hash
Small key speed test - 7-byte keys - 31.00 cycles/hash
Small key speed test - 8-byte keys - 30.81 cycles/hash
Small key speed test - 9-byte keys - 34.60 cycles/hash
Small key speed test - 10-byte keys - 37.00 cycles/hash
Small key speed test - 11-byte keys - 40.36 cycles/hash
Small key speed test - 12-byte keys - 34.16 cycles/hash
Small key speed test - 13-byte keys - 37.46 cycles/hash
Small key speed test - 14-byte keys - 40.94 cycles/hash
Small key speed test - 15-byte keys - 44.00 cycles/hash
Small key speed test - 16-byte keys - 34.65 cycles/hash
Small key speed test - 17-byte keys - 37.00 cycles/hash
Small key speed test - 18-byte keys - 40.85 cycles/hash
Small key speed test - 19-byte keys - 44.86 cycles/hash
Small key speed test - 20-byte keys - 38.00 cycles/hash
Small key speed test - 21-byte keys - 41.33 cycles/hash
Small key speed test - 22-byte keys - 44.00 cycles/hash
Small key speed test - 23-byte keys - 48.48 cycles/hash
Small key speed test - 24-byte keys - 38.00 cycles/hash
Small key speed test - 25-byte keys - 41.00 cycles/hash
Small key speed test - 26-byte keys - 47.42 cycles/hash
Small key speed test - 27-byte keys - 48.00 cycles/hash
Small key speed test - 28-byte keys - 42.54 cycles/hash
Small key speed test - 29-byte keys - 45.28 cycles/hash
Small key speed test - 30-byte keys - 49.22 cycles/hash
Small key speed test - 31-byte keys - 52.37 cycles/hash
Average 37.737 cycles/hash
--- Testing metrohash64_1 "MetroHash64_1 for 64-bit"
[[[ Sanity Tests ]]]
Verification value 0xEE88F7D2 : PASS
Running sanity check 1 ..........PASS
Running AppendedZeroesTest..........PASS
[[[ Speed Tests ]]]
Bulk speed test - 262144-byte keys
Alignment 7 - 6.466 bytes/cycle - 18498.28 MiB/sec @ 3 ghz
Alignment 6 - 6.436 bytes/cycle - 18414.10 MiB/sec @ 3 ghz
Alignment 5 - 6.218 bytes/cycle - 17791.07 MiB/sec @ 3 ghz
Alignment 4 - 6.446 bytes/cycle - 18440.76 MiB/sec @ 3 ghz
Alignment 3 - 6.516 bytes/cycle - 18643.62 MiB/sec @ 3 ghz
Alignment 2 - 6.476 bytes/cycle - 18528.83 MiB/sec @ 3 ghz
Alignment 1 - 6.511 bytes/cycle - 18629.38 MiB/sec @ 3 ghz
Alignment 0 - 6.676 bytes/cycle - 19099.58 MiB/sec @ 3 ghz
Average - 6.468 bytes/cycle - 18505.70 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 - 22.80 cycles/hash
Small key speed test - 4-byte keys - 18.41 cycles/hash
Small key speed test - 5-byte keys - 23.99 cycles/hash
Small key speed test - 6-byte keys - 23.96 cycles/hash
Small key speed test - 7-byte keys - 28.92 cycles/hash
Small key speed test - 8-byte keys - 27.20 cycles/hash
Small key speed test - 9-byte keys - 29.08 cycles/hash
Small key speed test - 10-byte keys - 29.19 cycles/hash
Small key speed test - 11-byte keys - 33.10 cycles/hash
Small key speed test - 12-byte keys - 29.22 cycles/hash
Small key speed test - 13-byte keys - 37.50 cycles/hash
Small key speed test - 14-byte keys - 33.39 cycles/hash
Small key speed test - 15-byte keys - 37.92 cycles/hash
Small key speed test - 16-byte keys - 30.33 cycles/hash
Small key speed test - 17-byte keys - 34.00 cycles/hash
Small key speed test - 18-byte keys - 34.02 cycles/hash
Small key speed test - 19-byte keys - 37.92 cycles/hash
Small key speed test - 20-byte keys - 34.20 cycles/hash
Small key speed test - 21-byte keys - 37.80 cycles/hash
Small key speed test - 22-byte keys - 37.98 cycles/hash
Small key speed test - 23-byte keys - 42.58 cycles/hash
Small key speed test - 24-byte keys - 34.29 cycles/hash
Small key speed test - 25-byte keys - 38.74 cycles/hash
Small key speed test - 26-byte keys - 37.29 cycles/hash
Small key speed test - 27-byte keys - 41.00 cycles/hash
Small key speed test - 28-byte keys - 37.65 cycles/hash
Small key speed test - 29-byte keys - 41.00 cycles/hash
Small key speed test - 30-byte keys - 41.71 cycles/hash
Small key speed test - 31-byte keys - 45.84 cycles/hash
Average 32.871 cycles/hash
--- Testing metrohash64crc_1 "MetroHash64crc_1 for x64"
[[[ Sanity Tests ]]]
Verification value 0x29C68A50 : PASS
Running sanity check 1 ..........PASS
Running AppendedZeroesTest..........PASS
[[[ Speed Tests ]]]
Bulk speed test - 262144-byte keys
Alignment 7 - 10.785 bytes/cycle - 30857.32 MiB/sec @ 3 ghz
Alignment 6 - 7.986 bytes/cycle - 22848.70 MiB/sec @ 3 ghz
Alignment 5 - 9.084 bytes/cycle - 25990.22 MiB/sec @ 3 ghz
Alignment 4 - 8.705 bytes/cycle - 24904.86 MiB/sec @ 3 ghz
Alignment 3 - 9.312 bytes/cycle - 26641.40 MiB/sec @ 3 ghz
Alignment 2 - 9.567 bytes/cycle - 27372.12 MiB/sec @ 3 ghz
Alignment 1 - 10.151 bytes/cycle - 29042.75 MiB/sec @ 3 ghz
Alignment 0 - 9.258 bytes/cycle - 26486.22 MiB/sec @ 3 ghz
Average - 9.356 bytes/cycle - 26767.95 MiB/sec @ 3 ghz
Small key speed test - 1-byte keys - 18.80 cycles/hash
Small key speed test - 2-byte keys - 19.63 cycles/hash
Small key speed test - 3-byte keys - 25.01 cycles/hash
Small key speed test - 4-byte keys - 19.15 cycles/hash
Small key speed test - 5-byte keys - 24.92 cycles/hash
Small key speed test - 6-byte keys - 24.00 cycles/hash
Small key speed test - 7-byte keys - 30.76 cycles/hash
Small key speed test - 8-byte keys - 25.38 cycles/hash
Small key speed test - 9-byte keys - 34.20 cycles/hash
Small key speed test - 10-byte keys - 30.89 cycles/hash
Small key speed test - 11-byte keys - 36.45 cycles/hash
Small key speed test - 12-byte keys - 30.68 cycles/hash
Small key speed test - 13-byte keys - 36.88 cycles/hash
Small key speed test - 14-byte keys - 44.51 cycles/hash
Small key speed test - 15-byte keys - 42.52 cycles/hash
Small key speed test - 16-byte keys - 29.52 cycles/hash
Small key speed test - 17-byte keys - 35.43 cycles/hash
Small key speed test - 18-byte keys - 35.57 cycles/hash
Small key speed test - 19-byte keys - 42.90 cycles/hash
Small key speed test - 20-byte keys - 35.00 cycles/hash
Small key speed test - 21-byte keys - 41.88 cycles/hash
Small key speed test - 22-byte keys - 47.02 cycles/hash
Small key speed test - 23-byte keys - 47.26 cycles/hash
Small key speed test - 24-byte keys - 33.50 cycles/hash
Small key speed test - 25-byte keys - 39.33 cycles/hash
Small key speed test - 26-byte keys - 39.16 cycles/hash
Small key speed test - 27-byte keys - 46.94 cycles/hash
Small key speed test - 28-byte keys - 40.27 cycles/hash
Small key speed test - 29-byte keys - 45.88 cycles/hash
Small key speed test - 30-byte keys - 45.00 cycles/hash
Small key speed test - 31-byte keys - 51.64 cycles/hash
Average 35.487 cycles/hash
--- Testing seahash "seahash"
[[[ Sanity Tests ]]]
Verification value 0x25AE1F61 : PASS
Running sanity check 1 ..........PASS
Running AppendedZeroesTest..........PASS
[[[ Speed Tests ]]]
Bulk speed test - 262144-byte keys
Alignment 7 - 3.181 bytes/cycle - 9102.09 MiB/sec @ 3 ghz
Alignment 6 - 3.277 bytes/cycle - 9376.04 MiB/sec @ 3 ghz
Alignment 5 - 3.290 bytes/cycle - 9412.64 MiB/sec @ 3 ghz
Alignment 4 - 3.320 bytes/cycle - 9498.83 MiB/sec @ 3 ghz
Alignment 3 - 3.415 bytes/cycle - 9770.01 MiB/sec @ 3 ghz
Alignment 2 - 3.448 bytes/cycle - 9864.58 MiB/sec @ 3 ghz
Alignment 1 - 3.448 bytes/cycle - 9864.70 MiB/sec @ 3 ghz
Alignment 0 - 3.487 bytes/cycle - 9976.74 MiB/sec @ 3 ghz
Average - 3.358 bytes/cycle - 9608.20 MiB/sec @ 3 ghz
Small key speed test - 1-byte keys - 36.00 cycles/hash
Small key speed test - 2-byte keys - 36.00 cycles/hash
Small key speed test - 3-byte keys - 37.00 cycles/hash
Small key speed test - 4-byte keys - 39.99 cycles/hash
Small key speed test - 5-byte keys - 41.00 cycles/hash
Small key speed test - 6-byte keys - 41.88 cycles/hash
Small key speed test - 7-byte keys - 41.93 cycles/hash
Small key speed test - 8-byte keys - 29.97 cycles/hash
Small key speed test - 9-byte keys - 41.99 cycles/hash
Small key speed test - 10-byte keys - 42.62 cycles/hash
Small key speed test - 11-byte keys - 43.00 cycles/hash
Small key speed test - 12-byte keys - 42.84 cycles/hash
Small key speed test - 13-byte keys - 46.00 cycles/hash
Small key speed test - 14-byte keys - 46.12 cycles/hash
Small key speed test - 15-byte keys - 47.00 cycles/hash
Small key speed test - 16-byte keys - 30.20 cycles/hash
Small key speed test - 17-byte keys - 40.21 cycles/hash
Small key speed test - 18-byte keys - 41.36 cycles/hash
Small key speed test - 19-byte keys - 42.09 cycles/hash
Small key speed test - 20-byte keys - 44.00 cycles/hash
Small key speed test - 21-byte keys - 45.13 cycles/hash
Small key speed test - 22-byte keys - 45.14 cycles/hash
Small key speed test - 23-byte keys - 46.00 cycles/hash
Small key speed test - 24-byte keys - 29.00 cycles/hash
Small key speed test - 25-byte keys - 39.99 cycles/hash
Small key speed test - 26-byte keys - 41.00 cycles/hash
Small key speed test - 27-byte keys - 41.00 cycles/hash
Small key speed test - 28-byte keys - 44.00 cycles/hash
Small key speed test - 29-byte keys - 44.00 cycles/hash
Small key speed test - 30-byte keys - 45.00 cycles/hash
Small key speed test - 31-byte keys - 46.35 cycles/hash
Average 41.220 cycles/hash