Closed tansy closed 4 years ago
Take a long document, find all substrings of length n, and hash those (n-grams). For extra points, vary n.
Reference: https://arxiv.org/abs/0705.4676
That's not exactly what I meant. IMO to test string hash one needs set of strings with various lengths that would be somewhat similar to real data where that hash could find application. To simulate such data I need to get data that are close to that "real application" and so I chose those mentioned above. Question is, or actually two: Is this right approach? And is that particular set right to simulate real data that would sufficiently stress hash in given application or not. If not then what strings, or lengths for that matter, would be right.
IMO to test string hash one needs set of strings with various lengths that would be somewhat similar to real data where that hash could find application
From your earlier comment, presumably the app in question will be hashing passwords (in which case you don't actually want a fast hashing algo), or other inputs expected to be comprised of English words or variants - if so, extracting substrings from an English corpus as @lemire suggested should indeed give you representative frequencies and sequences of characters.
But the individual characters that comprise input strings make almost no difference, as you're ultimately hashing bytes, not characters in any specific encoding; so simply benchmarking with strings of the expected lengths makes sense to me, regardless of whether they are n-grams from an English corpus or just randomly generated.
It's not to hash passwords. There are cryptographic hashes for that. It's to test speed of string hashes, as wyhash is, and compare them to the other used or not used for that. The "real life" data idea come from realization of application for such hash. Passwords set is equivalent to search single words, search engine search queries for short phrases, and tong twisters for whole sentences. It's more like exercise, with some realistic application though.
Hi Wang Yi, thanks for sharing freely your work, allow me to quicktest your superstrong hasher.
I would have included Yann's functions and Leo Yuriev's functions, but most likely will mess something.
Take a long document, find all substrings of length n, and hash those (n-grams). For extra points, vary n.
Hm, exactly that is what I do right now, hashing chunks of short data (4,6,8,10,12,14,16,18,36,64) at each position of a file (to be compressed). This is kinda the ultimate real-world stress scenario. Plenty of data it is, for enwik9 it is ~10x1G keys, maybe 9 billion of them unique. An interesting torture it is since I . Perhaps after a month or so will share it.
@tansy
What would be representative set of strings to test the hash?
A quite good question, I played a lot with n-grams and all kinds of hashable data, still I don't have good answer to that.
I get what you are asking, so let me share 15 lightweight corpora, the REPRODUCIBLE benchmark with C source PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke2.zip 41.1 MB (43,161,418 bytes) is freely downloadable at: https://drive.google.com/file/d/1UCrNH7x11UCAhmuC5riE6SEQvo7nZ-qz/view?usp=sharing or www.sanmayce.com/Fastest_Hash/PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke2.zip
Note1: The resultant file after running 'RUNME_64bit.BAT', the testmachine is my laptop, i5-7200u, Windows 10. Note2: The first column is time (the-lower-the-better), the last column is collisions (the-lower-the-better). Note3: Many thanks go to Peter Kankowski, the page he created shows those real-world cases where the lookupers are barefooted (not ramped up yet), well done indeed, latency is imediately highlighted.
dic_common_words.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 16 [ 110]
Meiyan: 16 [ 102]
Yorikke: 17 [ 116] ! Hm, nothing here to write home about !
Yoshimura: 17 [ 109]
wyhash: 40 [ 110]
YoshimitsuTRIAD: 20 [ 108]
FNV-1a: 28 [ 124]
Larson: 21 [ 99]
CRC-32: 21 [ 101]
Murmur2: 19 [ 103]
Murmur3: 19 [ 101]
XXHfast32: 24 [ 110]
XXHstrong32: 24 [ 109]
iSCSI CRC: 13 [ 105]
dic_fr.txt:
13408 lines read
32768 elements in the table (15 bits)
Jesteress: 1251 [ 2427]
Meiyan: 1253 [ 2377]
Yorikke: 828 [ 2382] ! Yum-yum, outspeeds iSCSI CRC !
Yoshimura: 1164 [ 2392]
wyhash: 1267 [ 2366] ! Wow, lowest collision rate !
YoshimitsuTRIAD: 1264 [ 2392]
FNV-1a: 1283 [ 2446]
Larson: 1279 [ 2447]
CRC-32: 1306 [ 2400]
Murmur2: 1378 [ 2399]
Murmur3: 1315 [ 2376]
XXHfast32: 1459 [ 2494]
XXHstrong32: 1495 [ 2496]
iSCSI CRC: 1097 [ 2388]
dic_ip.txt:
3925 lines read
8192 elements in the table (13 bits)
Jesteress: 203 [ 819]
Meiyan: 209 [ 807]
Yorikke: 186 [ 789] ! Beaten in speed department only by iSCSI CRC ! Lowest collision rate !
Yoshimura: 200 [ 821]
wyhash: 268 [ 793]
YoshimitsuTRIAD: 228 [ 821]
FNV-1a: 319 [ 796]
Larson: 304 [ 789]
CRC-32: 258 [ 802]
Murmur2: 256 [ 825]
Murmur3: 271 [ 818]
XXHfast32: 325 [ 829]
XXHstrong32: 330 [ 829]
iSCSI CRC: 175 [ 795]
dic_numbers.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 18 [ 300]
Meiyan: 16 [ 125]
Yorikke: 14 [ 82]
Yoshimura: 16 [ 86]
wyhash: 25 [ 120]
YoshimitsuTRIAD: 19 [ 86]
FNV-1a: 15 [ 108]
Larson: 14 [ 16] ! Larson smoked all !
CRC-32: 15 [ 64]
Murmur2: 18 [ 104]
Murmur3: 17 [ 104]
XXHfast32: 25 [ 102]
XXHstrong32: 25 [ 102]
iSCSI CRC: 11 [ 112]
dic_postfix.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 20 [ 106]
Meiyan: 22 [ 112]
Yorikke: 28 [ 99]
Yoshimura: 19 [ 112]
wyhash: 45 [ 103]
YoshimitsuTRIAD: 25 [ 103]
FNV-1a: 85 [ 105]
Larson: 80 [ 105]
CRC-32: 51 [ 94]
Murmur2: 32 [ 111]
Murmur3: 39 [ 105]
XXHfast32: 29 [ 106]
XXHstrong32: 32 [ 112]
iSCSI CRC: 25 [ 92]
dic_prefix.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 23 [ 102]
Meiyan: 22 [ 106]
Yorikke: 28 [ 100]
Yoshimura: 20 [ 109]
wyhash: 46 [ 109]
YoshimitsuTRIAD: 27 [ 101]
FNV-1a: 85 [ 94]
Larson: 81 [ 99]
CRC-32: 52 [ 107]
Murmur2: 34 [ 106]
Murmur3: 40 [ 103]
XXHfast32: 30 [ 103]
XXHstrong32: 33 [ 102]
iSCSI CRC: 27 [ 106]
dic_Shakespeare.txt:
3228 lines read
8192 elements in the table (13 bits)
Jesteress: 243 [ 585]
Meiyan: 243 [ 588]
Yorikke: 129 [ 535] ! Wot, by chance, it screams with Shakespeare; iSCSI CRC, "where you at"?
Yoshimura: 228 [ 552]
wyhash: 266 [ 599]
YoshimitsuTRIAD: 257 [ 552]
FNV-1a: 248 [ 555]
Larson: 235 [ 583]
CRC-32: 233 [ 563]
Murmur2: 261 [ 566]
Murmur3: 240 [ 555]
XXHfast32: 275 [ 491]
XXHstrong32: 279 [ 491]
iSCSI CRC: 207 [ 584]
Note: I believe, my second-favorite author B.Traven named Yorikke after the dead court jester: "Alas, poor Yorick! I knew him, Horatio; a fellow of infinite jest, of most excellent fancy ... " (Hamlet, V.i)
dic_variables.txt:
1842 lines read
4096 elements in the table (12 bits)
Jesteress: 155 [ 366]
Meiyan: 158 [ 350]
Yorikke: 92 [ 363] ! Hm, again unexpected speed dominance !
Yoshimura: 143 [ 356]
wyhash: 164 [ 372]
YoshimitsuTRIAD: 163 [ 361]
FNV-1a: 179 [ 374]
Larson: 162 [ 366]
CRC-32: 160 [ 338]
Murmur2: 164 [ 383]
Murmur3: 167 [ 334]
XXHfast32: 174 [ 347]
XXHstrong32: 175 [ 355]
iSCSI CRC: 143 [ 368]
KAZE_www.byronknoll.com_cmix-v18.zip_english.dic:
44880 lines read
131072 elements in the table (17 bits)
Jesteress: 4152 [ 6721]
Meiyan: 4177 [ 6923]
Yorikke: 2960 [ 6907] ! Yippee more speedy than iSCSI CRC !
Yoshimura: 3882 [ 7013]
wyhash: 4377 [ 6812]
YoshimitsuTRIAD: 4229 [ 7006]
FNV-1a: 4363 [ 6833]
Larson: 4287 [ 6830]
CRC-32: 4380 [ 6891]
Murmur2: 4627 [ 6820]
Murmur3: 4404 [ 6874]
XXHfast32: 4795 [ 6812]
XXHstrong32: 4890 [ 6819]
iSCSI CRC: 3635 [ 6785]
KAZE_3333_Latin_Powers.TXT:
3333 lines read
8192 elements in the table (13 bits)
Jesteress: 211 [ 576]
Meiyan: 225 [ 583]
Yorikke: 214 [ 577] ! Fun fact, this list I created thanks to the FNV co-creator Landon Curt Noll, he taught me to count to 1000^3333 !
Yoshimura: 150 [ 593]
wyhash: 284 [ 595]
YoshimitsuTRIAD: 239 [ 615]
FNV-1a: 550 [ 604]
Larson: 532 [ 581]
CRC-32: 398 [ 613]
Murmur2: 275 [ 600]
Murmur3: 311 [ 583]
XXHfast32: 225 [ 596]
XXHstrong32: 241 [ 571]
iSCSI CRC: 223 [ 594]
"KAZE_IPS_(3_million_IPs_dot_format).TXT":
2995394 lines read
8388608 elements in the table (23 bits)
Jesteress: 546685 [691369]
Meiyan: 539228 [593723]
Yorikke: 560117 [506963] ! Grmbl, worst case scenario it is !
Yoshimura: 470644 [476699]
wyhash: 567567 [476412]
YoshimitsuTRIAD: 537074 [476699]
FNV-1a: 730514 [477067]
Larson: 717599 [475575]
CRC-32: 611268 [472854]
Murmur2: 623405 [476330]
Murmur3: 592855 [476845]
XXHfast32: 729005 [476358]
XXHstrong32: 753368 [476358]
iSCSI CRC: 399073 [479542]
"KAZE_Word-list_12,561,874_wikipedia-en-html.tar.wrd":
12561874 lines read
33554432 elements in the table (25 bits)
Jesteress: 2596857 [2121868]
Meiyan: 2631083 [2111271]
Yorikke: 2510464 [2093403] ! Speedwise, second only to iSCSI CRC and Yoshimura, the result prompts for r.3 !
Yoshimura: 2395050 [2086155]
wyhash: 2818882 [2081865]
YoshimitsuTRIAD: 2704876 [2084931]
FNV-1a: 3146352 [2081195]
Larson: 3034551 [2080111]
CRC-32: 3000263 [2075088]
Murmur2: 3010539 [2081476]
Murmur3: 2888716 [2082084]
XXHfast32: 3273767 [2084164]
XXHstrong32: 3402679 [2084514]
iSCSI CRC: 2179113 [2077725] ! Thrashes every known hasher !
KAZE_google-10000-english-no-swears.txt:
9894 lines read
32768 elements in the table (15 bits)
Jesteress: 921 [ 1345]
Meiyan: 919 [ 1373]
Yorikke: 527 [ 1383] ! Fastest by a margin, don't know why, order 1000 !
Yoshimura: 854 [ 1367]
wyhash: 888 [ 1397]
YoshimitsuTRIAD: 917 [ 1365]
FNV-1a: 883 [ 1336]
Larson: 875 [ 1388]
CRC-32: 919 [ 1310]
Murmur2: 957 [ 1311]
Murmur3: 914 [ 1374]
XXHfast32: 1013 [ 1320]
XXHstrong32: 1033 [ 1320]
iSCSI CRC: 779 [ 1344]
KAZE_top_1000_internet_search_terms.txt:
1000 lines read
2048 elements in the table (11 bits)
Jesteress: 78 [ 202]
Meiyan: 80 [ 206]
Yorikke: 53 [ 213] ! Fastest by a margin, don't know why, one order less than Google corpus !
Yoshimura: 65 [ 207]
wyhash: 96 [ 214]
YoshimitsuTRIAD: 88 [ 204]
FNV-1a: 110 [ 191]
Larson: 100 [ 218]
CRC-32: 90 [ 184]
Murmur2: 85 [ 202]
Murmur3: 85 [ 199]
XXHfast32: 86 [ 192]
XXHstrong32: 82 [ 205]
iSCSI CRC: 77 [ 207]
Personally, I am kinda disappointed from my latest revision 2 of Yorikke, it so weak, and not fast enough for big data. Yet, it serves quite well as LOOKUPER, maybe someone can tweak it further.
Anyway, here is the 100% FREE C source:
// "There it now stands for ever. Black on white.
// I can't get away from it. Ahoy, Yorikke, ahoy, hoy, ho!
// Go to hell now if you wish. What do I care? It's all the same now to me.
// I am part of you now. Where you go I go, where you leave I leave, when you go to the devil I go. Married.
// Vanished from the living. Damned and doomed. Of me there is not left a breath in all the vast world.
// Ahoy, Yorikke! Ahoy, hoy, ho!
// I am not buried in the sea,
// The death ship is now part of me
// So far from sunny New Orleans
// So far from lovely Louisiana."
// /An excerpt from 'THE DEATH SHIP - THE STORY OF AN AMERICAN SAILOR' by B.TRAVEN/
//
// "Walking home to our good old Yorikke, I could not help thinking of this beautiful ship, with a crew on board that had faces as if they were seeing ghosts by day and by night.
// Compared to that gilded Empress, the Yorikke was an honorable old lady with lavender sachets in her drawers.
// Yorikke did not pretend to anything she was not. She lived up to her looks. Honest to her lowest ribs and to the leaks in her bilge.
// Now, what is this? I find myself falling in love with that old jane.
// All right, I cannot pass by you, Yorikke; I have to tell you I love you. Honest, baby, I love you.
// I have six black finger-nails, and four black and green-blue nails on my toes, which you, honey, gave me when necking you.
// Grate-bars have crushed some of my toes. And each finger-nail has its own painful story to tell.
// My chest, my back, my arms, my legs are covered with scars of burns and scorchings.
// Each scar, when it was being created, caused me pains which I shall surely never forget.
// But every outcry of pain was a love-cry for you, honey.
// You are no hypocrite. Your heart does not bleed tears when you do not feel heart-aches deeply and truly.
// You do not dance on the water if you do not feel like being jolly and kicking chasers in the pants.
// Your heart never lies. It is fine and clean like polished gold. Never mind the rags, honey dear.
// When you laugh, your whole soul and all your body is laughing.
// And when you weep, sweety, then you weep so that even the reefs you pass feel like weeping with you.
// I never want to leave you again, honey. I mean it. Not for all the rich and elegant buckets in the world.
// I love you, my gypsy of the sea!"
// /An excerpt from 'THE DEATH SHIP - THE STORY OF AN AMERICAN SAILOR' by B.TRAVEN/
//
#define _rotl_KAZE(x, n) (((x) << (n)) | ((x) >> (32-(n))))
#define _PADr_KAZE(x, n) ( ((x) << (n))>>(n) )
#define ROLInBits 27 // 5 in r.1; Caramba: it should be ROR by 5 not ROL, from the very beginning the idea was to mix two bytes by shifting/masking the first 5 'noisy' bits (ASCII 0-31 symbols).
// CAUTION: Add 8 more bytes to the buffer being hashed, usually malloc(...+8) - to prevent out of boundary reads!
uint32_t FNV1A_Hash_Yorikke_v2(const char *str, uint32_t wrdlen)
{
const uint32_t PRIME = 591798841;
uint32_t hash32 = 2166136261;
uint64_t PADDEDby8;
const char *p = str;
//uint64_t dbg=0x4241414141414143; // LSB first: CAAAAAAB
//int i;
//wrdlen=2;
//PADDEDby8 = ( (*(uint64_t *)(&dbg+0)) << ((8-wrdlen&7)<<3) ) >> ((8-wrdlen&7)<<3);
//PADDEDby8 = _PADr_KAZE(*(uint64_t *)(&dbg+0), (8-wrdlen&7)<<3);
//printf("\n");
//for (i=0; i<8; i++) {
//printf("%c",*((char *)&PADDEDby8+i)); //CA
//}
//printf("\n");
//exit(0);
for(; wrdlen >= 2*sizeof(uint32_t); wrdlen -= 2*sizeof(uint32_t), p += 2*sizeof(uint32_t)) {
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ (*(uint32_t *)(p+0)) ) * PRIME;
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ (*(uint32_t *)(p+4)) ) * PRIME;
}
// Alternatively, the remaining 7[-] bytes could be padded and processed as 2x4... with _PADr_KAZE(x, (8-wrdlen&7)<<3)
//if (wrdlen) {
PADDEDby8 = _PADr_KAZE(*(uint64_t *)(p+0), (8-wrdlen&7)<<3);
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ *(uint32_t *)((char *)&PADDEDby8+0) ) * PRIME;
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ *(uint32_t *)((char *)&PADDEDby8+4) ) * PRIME;
//}
// // Cases: 0,1,2,3,4,5,6,7
// if (wrdlen & sizeof(uint32_t)) {
// hash32 = (hash32 ^ *(uint16_t*)(p+0)) * PRIME;
// hash32B = (hash32B ^ *(uint16_t*)(p+2)) * PRIME;
// p += 2*sizeof(uint16_t);
// }
// if (wrdlen & sizeof(uint16_t)) {
// hash32 = (hash32 ^ *(uint16_t*)p) * PRIME;
// p += sizeof(uint16_t);
// }
// if (wrdlen & 1)
// hash32 = (hash32 ^ *p) * PRIME;
return hash32 ^ (hash32 >> 16);
}
// https://www.strchr.com/hash_functions#comment_776
Dummy me, had to fix v2, now everything is OK, my excuse - yesterday, have been distracted the whole day. So, here comes v3:
#define _rotl_KAZE(x, n) (((x) << (n)) | ((x) >> (32-(n))))
#define _PADr_KAZE(x, n) ( ((x) << (n))>>(n) )
#define ROLInBits 27 // 5 in r.1; Caramba: it should be ROR by 5 not ROL, from the very beginning the idea was to mix two bytes by shifting/masking the first 5 'noisy' bits (ASCII 0-31 symbols).
// CAUTION: Add 8 more bytes to the buffer being hashed, usually malloc(...+8) - to prevent out of boundary reads!
uint32_t FNV1A_Hash_Yorikke_v3(const char *str, uint32_t wrdlen)
{
const uint32_t PRIME = 591798841;
uint32_t hash32 = 2166136261;
uint64_t PADDEDby8;
const char *p = str;
for(; wrdlen > 2*sizeof(uint32_t); wrdlen -= 2*sizeof(uint32_t), p += 2*sizeof(uint32_t)) {
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ (*(uint32_t *)(p+0)) ) * PRIME;
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ (*(uint32_t *)(p+4)) ) * PRIME;
}
// Here 'wrdlen' is 1..8
PADDEDby8 = _PADr_KAZE(*(uint64_t *)(p+0), (8-wrdlen)<<3); // when (8-8) the QWORD remains intact
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ *(uint32_t *)((char *)&PADDEDby8+0) ) * PRIME;
hash32 = ( _rotl_KAZE(hash32,ROLInBits) ^ *(uint32_t *)((char *)&PADDEDby8+4) ) * PRIME;
return hash32 ^ (hash32 >> 16);
}
// Last touch: 2019-Oct-03, Kaze
And the rebenchmarked corpora, now added 'The Complete Works of William Shakespeare', for vintageness:
Note1: Dump made: 2019-Oct-03
Note2: To reproduce the benchmark, the package (source included) is downloadable at:
Note3: SITE1: https://drive.google.com/file/d/1ZroNWaseieR8ZyECKTFVrN0qIQXtyDVn/view?usp=sharing
Note4: SITE2: www.sanmayce.com/Fastest_Hash/PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3.zip
Note5: The first column is time (the-lower-the-better), the last column is collisions (the-lower-the-better).
Note6: Many thanks go to Peter Kankowski, the page he created shows those real-world cases where the lookupers are barefooted (not ramped up yet), well done indeed, latency is immediately highlighted.
Note7: The executable/compile is 64bit, Intel v15 Compiler was used.
Note8: The resultant file after running 'RUNME_64bit.BAT', the testmachine is my laptop, i5-7200U @3.1GHz, DDR4 2133MHz, Windows 10:
dic_common_words.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 16 [ 110]
Meiyan: 16 [ 102]
Yorikke: 15 [ 106] ! Beaten in speed department only by iSCSI CRC !
Yorikke: 26 [ 106] 32bit
Yoshimura: 16 [ 109]
wyhash: 39 [ 110]
YoshimitsuTRIAD: 22 [ 108]
FNV-1a: 20 [ 124]
Larson: 28 [ 99]
CRC-32: 19 [ 101]
Murmur2: 19 [ 103]
Murmur3: 19 [ 101]
XXHfast32: 24 [ 110]
XXHstrong32: 25 [ 109]
iSCSI CRC: 12 [ 105]
dic_fr.txt:
13408 lines read
32768 elements in the table (15 bits)
Jesteress: 1252 [ 2427]
Meiyan: 1250 [ 2377]
Yorikke: 827 [ 2412] ! Yum-yum, outspeeds iSCSI CRC !
Yorikke: 1173 [ 2412] 32bit
Yoshimura: 1150 [ 2392]
wyhash: 1253 [ 2366]
YoshimitsuTRIAD: 1277 [ 2392]
FNV-1a: 1284 [ 2446]
Larson: 1278 [ 2447]
CRC-32: 1302 [ 2400]
Murmur2: 1379 [ 2399]
Murmur3: 1307 [ 2376]
XXHfast32: 1467 [ 2494]
XXHstrong32: 1490 [ 2496]
iSCSI CRC: 1088 [ 2388]
dic_ip.txt:
3925 lines read
8192 elements in the table (13 bits)
Jesteress: 200 [ 819]
Meiyan: 206 [ 807]
Yorikke: 185 [ 791] ! Beaten in speed department only by iSCSI CRC !
Yorikke: 310 [ 791] 32bit
Yoshimura: 189 [ 821]
wyhash: 237 [ 793]
YoshimitsuTRIAD: 234 [ 821]
FNV-1a: 319 [ 796]
Larson: 301 [ 789]
CRC-32: 264 [ 802]
Murmur2: 249 [ 825]
Murmur3: 264 [ 818]
XXHfast32: 323 [ 829]
XXHstrong32: 332 [ 829]
iSCSI CRC: 171 [ 795]
dic_numbers.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 17 [ 300]
Meiyan: 16 [ 125]
Yorikke: 14 [ 82] ! Beaten in speed department only by iSCSI CRC !
Yorikke: 18 [ 82] 32bit
Yoshimura: 16 [ 86]
wyhash: 21 [ 120]
YoshimitsuTRIAD: 21 [ 86]
FNV-1a: 16 [ 108]
Larson: 14 [ 16]
CRC-32: 14 [ 64]
Murmur2: 18 [ 104]
Murmur3: 17 [ 104]
XXHfast32: 24 [ 102]
XXHstrong32: 25 [ 102]
iSCSI CRC: 10 [ 112]
dic_postfix.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 21 [ 106]
Meiyan: 21 [ 112]
Yorikke: 27 [ 100]
Yorikke: 35 [ 100] 32bit
Yoshimura: 18 [ 112]
wyhash: 44 [ 103]
YoshimitsuTRIAD: 26 [ 103]
FNV-1a: 80 [ 105]
Larson: 82 [ 105]
CRC-32: 54 [ 94]
Murmur2: 32 [ 111]
Murmur3: 41 [ 105]
XXHfast32: 29 [ 106]
XXHstrong32: 32 [ 112]
iSCSI CRC: 24 [ 92]
dic_prefix.txt:
500 lines read
1024 elements in the table (10 bits)
Jesteress: 23 [ 102]
Meiyan: 24 [ 106]
Yorikke: 29 [ 92]
Yorikke: 36 [ 92] 32bit
Yoshimura: 21 [ 109]
wyhash: 46 [ 109]
YoshimitsuTRIAD: 27 [ 101]
FNV-1a: 81 [ 94]
Larson: 84 [ 99]
CRC-32: 57 [ 107]
Murmur2: 33 [ 106]
Murmur3: 42 [ 103]
XXHfast32: 31 [ 103]
XXHstrong32: 34 [ 102]
iSCSI CRC: 26 [ 106]
dic_Shakespeare.txt:
3228 lines read
8192 elements in the table (13 bits)
Jesteress: 243 [ 585]
Meiyan: 242 [ 588]
Yorikke: 109 [ 536] ! Wot, by chance, it screams with Shakespeare; iSCSI CRC, "where you at"?
Yorikke: 199 [ 536] 32bit
Yoshimura: 221 [ 552]
wyhash: 267 [ 599]
YoshimitsuTRIAD: 259 [ 552]
FNV-1a: 236 [ 555]
Larson: 252 [ 583]
CRC-32: 237 [ 563]
Murmur2: 259 [ 566]
Murmur3: 238 [ 555]
XXHfast32: 274 [ 491]
XXHstrong32: 279 [ 491]
iSCSI CRC: 205 [ 584]
Note: I believe, my second-favorite author B.Traven named Yorikke after the dead court jester: "Alas, poor Yorick! I knew him, Horatio; a fellow of infinite jest, of most excellent fancy ... " (Hamlet, V.i)
dic_variables.txt:
1842 lines read
4096 elements in the table (12 bits)
Jesteress: 157 [ 366]
Meiyan: 156 [ 350]
Yorikke: 91 [ 350] ! Hm, again unexpected speed dominance !
Yorikke: 149 [ 350] 32bit
Yoshimura: 139 [ 356]
wyhash: 161 [ 372]
YoshimitsuTRIAD: 163 [ 361]
FNV-1a: 165 [ 374]
Larson: 180 [ 366]
CRC-32: 160 [ 338]
Murmur2: 164 [ 383]
Murmur3: 161 [ 334]
XXHfast32: 174 [ 347]
XXHstrong32: 180 [ 355]
iSCSI CRC: 143 [ 368]
KAZE_www.byronknoll.com_cmix-v18.zip_english.dic:
44880 lines read
131072 elements in the table (17 bits)
Jesteress: 4204 [ 6721]
Meiyan: 4214 [ 6923]
Yorikke: 2839 [ 6883] ! Yippee, far more speedy than iSCSI CRC !
Yorikke: 3875 [ 6883] 32bit
Yoshimura: 3858 [ 7013]
wyhash: 4374 [ 6812]
YoshimitsuTRIAD: 4317 [ 7006]
FNV-1a: 4361 [ 6833]
Larson: 4391 [ 6830]
CRC-32: 4445 [ 6891]
Murmur2: 4692 [ 6820]
Murmur3: 4420 [ 6874]
XXHfast32: 4884 [ 6812]
XXHstrong32: 4939 [ 6819]
iSCSI CRC: 3641 [ 6785]
KAZE_3333_Latin_Powers.TXT:
3333 lines read
8192 elements in the table (13 bits)
Jesteress: 225 [ 576]
Meiyan: 224 [ 583]
Yorikke: 228 [ 573] ! Fun fact, this list I created thanks to the FNV co-creator Landon Curt Noll, he taught me to count to 1000^3333 !
Yorikke: 316 [ 573] 32bit
Yoshimura: 162 [ 593]
wyhash: 272 [ 595]
YoshimitsuTRIAD: 251 [ 615]
FNV-1a: 548 [ 604]
Larson: 545 [ 581]
CRC-32: 411 [ 613]
Murmur2: 296 [ 600]
Murmur3: 332 [ 583]
XXHfast32: 237 [ 596]
XXHstrong32: 259 [ 571]
iSCSI CRC: 229 [ 594]
"KAZE_IPS_(3_million_IPs_dot_format).TXT":
2995394 lines read
8388608 elements in the table (23 bits)
Jesteress: 547282 [691369]
Meiyan: 539112 [593723]
Yorikke: 567617 [506954] ! Grmbl, worst case scenario it is !
Yorikke: 688533 [506954] 32bit
Yoshimura: 480722 [476699]
wyhash: 562799 [476412]
YoshimitsuTRIAD: 541813 [476699]
FNV-1a: 733488 [477067]
Larson: 716425 [475575]
CRC-32: 609206 [472854]
Murmur2: 619974 [476330]
Murmur3: 592856 [476845]
XXHfast32: 727706 [476358]
XXHstrong32: 736428 [476358]
iSCSI CRC: 398383 [479542]
"KAZE_Word-list_12,561,874_wikipedia-en-html.tar.wrd":
12561874 lines read
33554432 elements in the table (25 bits)
Jesteress: 2592315 [2121868]
Meiyan: 2628616 [2111271]
Yorikke: 2455041 [2099673]
Yorikke: 2882352 [2099673] 32bit
Yoshimura: 2392804 [2086155]
wyhash: 2796792 [2081865]
YoshimitsuTRIAD: 2703629 [2084931]
FNV-1a: 3153671 [2081195]
Larson: 3040551 [2080111]
CRC-32: 2995319 [2075088]
Murmur2: 3009458 [2081476]
Murmur3: 2893319 [2082084]
XXHfast32: 3282122 [2084164]
XXHstrong32: 3399112 [2084514]
iSCSI CRC: 2170786 [2077725]
The Complete Works of William Shakespeare by William Shakespeare:
138578 lines read
524288 elements in the table (19 bits)
Jesteress: 26668 [31211]
Meiyan: 27064 [31116]
Yorikke: 26317 [31139] ! Here the keys are mostly 40..60 bytes ins size, Yorikke is a sprinter in 1..32, xxfast is ramping up !
Yorikke: 26423 [31139] 32bit
Yoshimura: 20169 [31245]
wyhash: 29015 [31260]
YoshimitsuTRIAD: 29510 [31316]
FNV-1a: 51815 [31178]
Larson: 51420 [31406]
CRC-32: 42672 [31210]
Murmur2: 33458 [31203]
Murmur3: 33499 [31308]
XXHfast32: 26031 [31146]
XXHstrong32: 28479 [31118]
iSCSI CRC: 23308 [31248]
End.
Is there another hasher outspeeding the SSE4.2 iSCSI-CRC?
ha, i just see that wyhash is almost slowest. However, I like your website very much. I sense great culture on it :-)
Dear Sanmayce:
I check your hash function with SMHasher (https://github.com/rurban/smhasher), and found it is fails test and not fast.
--- Testing Yorikke_v3 "Yorikke_v3"
[[[ Sanity Tests ]]]
Verification value 0x74C8C5DC ....... PASS Running sanity check 1 .......... PASS Running AppendedZeroesTest . FAIL !!!!!
[[[ Speed Tests ]]]
Bulk speed test - 262144-byte keys Alignment 7 - 1.193 bytes/cycle - 3411.83 MiB/sec @ 3 ghz Alignment 6 - 1.193 bytes/cycle - 3411.81 MiB/sec @ 3 ghz Alignment 5 - 1.193 bytes/cycle - 3411.82 MiB/sec @ 3 ghz Alignment 4 - 1.200 bytes/cycle - 3432.39 MiB/sec @ 3 ghz Alignment 3 - 1.193 bytes/cycle - 3411.82 MiB/sec @ 3 ghz Alignment 2 - 1.193 bytes/cycle - 3411.81 MiB/sec @ 3 ghz Alignment 1 - 1.193 bytes/cycle - 3411.81 MiB/sec @ 3 ghz Alignment 0 - 1.200 bytes/cycle - 3432.40 MiB/sec @ 3 ghz Average - 1.194 bytes/cycle - 3416.96 MiB/sec @ 3 ghz
Small key speed test - 1-byte keys - 23.00 cycles/hash Small key speed test - 2-byte keys - 23.00 cycles/hash Small key speed test - 3-byte keys - 23.00 cycles/hash Small key speed test - 4-byte keys - 23.00 cycles/hash Small key speed test - 5-byte keys - 23.00 cycles/hash Small key speed test - 6-byte keys - 23.00 cycles/hash Small key speed test - 7-byte keys - 23.00 cycles/hash Small key speed test - 8-byte keys - 23.00 cycles/hash Small key speed test - 9-byte keys - 22.00 cycles/hash Small key speed test - 10-byte keys - 22.00 cycles/hash Small key speed test - 11-byte keys - 22.00 cycles/hash Small key speed test - 12-byte keys - 22.00 cycles/hash Small key speed test - 13-byte keys - 22.00 cycles/hash Small key speed test - 14-byte keys - 22.00 cycles/hash Small key speed test - 15-byte keys - 22.00 cycles/hash Small key speed test - 16-byte keys - 22.00 cycles/hash Small key speed test - 17-byte keys - 28.00 cycles/hash Small key speed test - 18-byte keys - 28.00 cycles/hash Small key speed test - 19-byte keys - 28.00 cycles/hash Small key speed test - 20-byte keys - 28.00 cycles/hash Small key speed test - 21-byte keys - 28.00 cycles/hash Small key speed test - 22-byte keys - 28.00 cycles/hash Small key speed test - 23-byte keys - 28.00 cycles/hash Small key speed test - 24-byte keys - 28.00 cycles/hash Small key speed test - 25-byte keys - 35.00 cycles/hash Small key speed test - 26-byte keys - 35.00 cycles/hash Small key speed test - 27-byte keys - 35.00 cycles/hash Small key speed test - 28-byte keys - 35.00 cycles/hash Small key speed test - 29-byte keys - 35.00 cycles/hash Small key speed test - 30-byte keys - 35.00 cycles/hash Small key speed test - 31-byte keys - 35.00 cycles/hash Average 26.742 cycles/hash
[[[ Avalanche Tests ]]]
Testing 24-bit keys -> 32-bit hashes, 300000 reps worst bias is 100.000000% !!!!! Testing 32-bit keys -> 32-bit hashes, 300000 reps worst bias is 100.000000% !!!!! Testing 40-bit keys -> 32-bit hashes, 300000 reps worst bias is 100.000000% !!!!! Testing 48-bit keys -> 32-bit hashes, 300000 reps worst bias is 100.000000% !!!!! Testing 56-bit keys -> 32-bit hashes, 300000 reps worst bias is 100.000000% !!!!!
Thank you Wang Yi, the whole purpose of me writing C etudes is to boost textual processing (searching, hashing, decompressing), my affinity to literature is what drives me to sidekick text experience with superfast textual tools.
I check your hash function with SMHasher (https://github.com/rurban/smhasher), and found it is fails test and not fast.
Indeed, lowest quality and significant speed drop for 16+ bytes long keys.
See, the actual terms are not well-set when speaking of hashes, my only interest is in hashing for lookuping tables, therefore I do call such hashes - LOOKUPERS, in order to distinguish them from the checksumming hashes.
Seeing Reini 's roster, your hash scores the best speed of 17.67 cycles/hash, why then in above tests with Peter's benchmarker Yorikke is faster? To me, practicalness is more important than anything, I need hash tables in range 20..30bit with billion of keys, my experiments with 1 trillion Knight-Tours being 128bytes long keys, also with billions of n-grams showed that FNV1A (with 4bytes granularity) was SUPERPRACTICAL and SUPERFAST, my explanation is that HIGH-QUALITY hashes passing SMHASHER are OVERKILL - meaning they are MUCH MUCH stronger than needed!
Thanks again for your wyhash, hopefully later this year I will finish my Nakamichi new matchfinder, there a real-world scenario is to be used as a benchmark simply by changing the LOOKUPER - I will try wyhash along with FNV1A-Yorikke and will share my findings with you.
Dear Wang Yi, allow me to share some informative dumps, before I write the promised benchmarker.
Hashtime, my word is for hash-table lookup functions.
First, my wish is to have one package where the C sources are included along with the executables, of course and many a corpus (14+1 for now) for testing. Thus, all users can REPRODUCE the results, so the package (190,883,757 bytes in size) is downloadable at: www.sanmayce.com/Fastest_Hash/Night_Light_Sky_hash_package_r4.zip https://drive.google.com/file/d/1XDWssBK8Inoxtkl_oopMoeb2HI1m1xZr/view?usp=sharing
Using Peter Kankowski's hash benchmark tool proves superinstrumental, I compiled it with the latest Intel v19 Compiler, both as 32bit and 64bit - all the console dumps are included in the package. For more spiciness, I created the latest English Wikipedia's 1-gram corpus (i.e. worldlist) with my phrase ripper, thus a 427MB (42,206,534 unique words strong, out of 9,798,256,235 non-unique) is included. The ripper is also with its source - it in itself is a superbenchmarker since (just by replacing the hash function) it can report how fast IN REAL CONDITIONS your hasher/lookuper works, yes, it has to hash ~10 billion words/keys 1..31 bytes long. The hasher that I chose within the ripper was FNV1A-Jesteress, it hashes at ~10 million words-per-second. For my laptop (i5-7200U, Windows 10) the speed is:
D:\Night_Light_Sky_hash_package_r4>dir
10/06/2019 10:21 AM 73,843,742,025 enwiki-20190920-pages-articles.xml
10/06/2019 09:31 PM 147,968 Leprechaun_x-leton_64bit_Intel_01_001p.exe
D:\Night_Light_Sky_hash_package_r4>dir enwiki-20190920-pages-articles.xml/b 1>rip.lst
D:\Night_Light_Sky_hash_package_r4>Leprechaun_x-leton_64bit_Intel_01_001p.exe rip.lst enwiki-20190920-pages-articles.xml.wrd 5123456 y
Leprechaun_singleton (Fast-In-Future Greedy n-gram-Ripper), rev. 17tagFIX, written by Svalqyatchx.
Purpose: Rips all distinct 1-grams (1-word phrases) with length 1..31 chars from incoming texts.
Feature1: All words within x-lets/n-grams are in range 1..31 chars inclusive.
Feature2: In this revision 512MB 1-way hash is used which results in 67,108,864 external B-Trees of order 3.
Feature3: In this revision, 1 pass is to be made.
Feature4: If the external memory has latency 99+microseconds then !(look no further), IOPS(seek-time) rules.
Pass #1 of 1:
Size of input file with files for Leprechauning: 36
Allocating HASH memory 536,870,977 bytes ... OK
Allocating memory 5004MB ... OK
Size of Input TEXTual file: 73,843,742,025
-; 09,927,311P/s; Phrase count: 9,798,256,235 of them 42,206,534 distinct; Done: 64/64
Bytes per second performance: 74,816,354B/s
Phrases per second performance: 9,927,311P/s
Time for putting phrases into trees: 987 second(s)
Flushing UNsorted phrases: 100%; Shaking trees performance: 02,813,768P/s
Time for shaking phrases from trees: 15 second(s)
Leprechaun: Current pass done.
Total memory needed for one pass: 3,266,229KB
Total distinct phrases: 42,206,534
Total time: 1004 second(s)
Total performance: 9,759,219P/s i.e. phrases per second
Leprechaun: Done.
These 42 million keys are hashed using hashtables of 24..29bit, to show collisions in scenarios where hashslots are less/more than the keys, the last column shows collisions, the column before is the time, as the comedy film was, 'Analyze This':
D:\Night_Light_Sky_hash_package_r4\PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3>hash_ICLv19_64bit.exe enwiki-20190920-pages-articles.xml.SORTED.wrd /s24
42206534 lines read
16777216 elements in the table (24 bits)
Jesteress: 19837004 19744107 19739719 19755910 19742156 19668748 20589371 19884836 19700891 19708473| 19668748 [26812816]
Meiyan: 20199770 20147660 20126335 20223568 20178595 21431329 20153977 20114470 20110313 20116571| 20110313 [26799900]
Yorikke: 19872292 19846918 19835263 19870860 21191255 19826563 19833180 19843503 19825526 19841150| 19825526 [26804887]
Yoshimura: 20503656 20550035 20545757 21892942 20498189 20560371 20497050 20500010 20500356 20504814| 20497050 [26784148]
wyhash: 22378434 23906733 22398408 22369006 22393020 22330668 22353297 22350772 22348116 24013468| 22330668 [26785668]
YoshimitsuTRIAD: 21297981 21227336 21225133 21233648 21237991 21277222 21291206 22430101 21360375 21281795| 21225133 [26784945]
FNV-1a: 23903498 23909055 24466425 23929726 23958739 25169442 23911094 23882663 23874284 23989815| 23874284 [26781769]
Larson: 22669280 22651310 23506091 23048720 22677744 22648155 22622124 22645644 22693429 22663175| 22622124 [26778746]
CRC-32: 24293990 22745635 22746350 22762428 22777194 22867085 22782242 22802982 24382462 22774456| 22745635 [26719661]
Murmur2: 22684642 22701477 22742067 22692908 22688840 22800128 23491832 22716329 22721556 22789959| 22684642 [26783774]
Murmur3: 22925866 22972631 22892054 23573036 23314876 22886869 22960772 22921741 22943607 22925938| 22886869 [26785760]
XXHfast32: 24307937 25743340 24265034 24259949 24244029 24238295 24185653 24210382 25585532 24249928| 24185653 [26788571]
XXHstrong32: 24656199 24591001 24634655 24636520 24617929 25274967 25351096 24622450 24603446 24653730| 24591001 [26788993]
iSCSI CRC: 18153826 18134569 18129848 18251559 19549877 18146621 18129713 18135449 18182760 18128268| 18128268 [26742951]
D:\Night_Light_Sky_hash_package_r4\PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3>hash_ICLv19_64bit.exe enwiki-20190920-pages-articles.xml.SORTED.wrd /s25
42206534 lines read
33554432 elements in the table (25 bits)
Jesteress: 14156969 14491173 13335665 13444085 13324627 13328905 13324255 13326424 13323258 13346006| 13323258 [18347249]
Meiyan: 13568711 13548939 13550921 13571175 15000020 13530740 13542589 13546497 13554384 13543147| 13530740 [18212050]
Yorikke: 13544036 13566647 13573337 13560259 13561043 13554086 13655357 14800814 13530919 13551287| 13530919 [18214348]
Yoshimura: 13791756 13789473 13807153 13799528 13794909 13786049 13780630 13782265 13776526 13985488| 13776526 [18190902]
wyhash: 16899972 15820498 15832171 15824836 15852173 15920852 15803507 15806636 15809729 15815720| 15803507 [18191777]
YoshimitsuTRIAD: 14606157 15961217 14563046 14567700 14582589 14611542 14571620 14564596 14619794 14570528| 14563046 [18191862]
FNV-1a: 17065944 17027955 17676264 17641065 17147863 17071749 17050278 17049351 17054215 17057382| 17027955 [18185414]
Larson: 16094887 16096742 16512291 18541724 16114712 16139315 16076946 16066917 16077938 16075313| 16066917 [18126241]
CRC-32: 16186482 16197833 16189334 16296185 17586974 16203110 16182666 16175395 16182501 16180514| 16175395 [17980999]
Murmur2: 16030183 16030853 16029145 16026753 16308129 16826121 16029393 16020803 16027761 16037226| 16020803 [18188187]
Murmur3: 16053781 16042899 16024340 16025832 16039663 16304684 17067195 16038225 16034684 16034042| 16024340 [18189502]
XXHfast32: 17315709 17308035 17308310 17305800 17340685 17317995 18713748 17304585 17306124 17309444| 17304585 [18199104]
XXHstrong32: 17777983 17788187 17768835 17824469 17815454 17798592 19361568 17782524 17794295 17794612| 17768835 [18200233]
iSCSI CRC: 12073616 12062974 12068610 12077792 12105648 12079563 12068712 12073793 12072229 13517255| 12062974 [18015767]
D:\Night_Light_Sky_hash_package_r4\PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3>hash_ICLv19_64bit.exe enwiki-20190920-pages-articles.xml.SORTED.wrd /s26
42206534 lines read
67108864 elements in the table (26 bits)
Jesteress: 11071678 10568142 10551954 10495673 11008119 11171024 10506318 10500554 10501418 10489299| 10489299 [10951272]
Meiyan: 10727035 10725510 10730211 10727823 10740168 10755555 10730820 10724475 10724648 10720847| 10720847 [10882580]
Yorikke: 10752192 11413761 10712600 10636831 10633503 10635397 10629076 10635742 10633089 10641800| 10629076 [10901270]
Yoshimura: 10970251 10943485 10937009 10938533 10929720 10935409 10935378 11992931 11333504 10948353| 10929720 [10880141]
wyhash: 12713655 12712766 12710910 12717710 12732021 12697881 12709216 12764810 12720506 12728077| 12697881 [10880658]
YoshimitsuTRIAD: 11624063 12260164 12183692 11622600 11613173 11622121 11681738 11631748 11631336 11619505| 11613173 [10880607]
FNV-1a: 13769625 13685127 13677145 13671763 13666911 14239106 14942689 13680902 13683447 13713570| 13666911 [10869907]
Larson: 12770396 12745596 12758925 12757801 12748775 12756931 12749702 12747760 12758229 13922170| 12745596 [10784384]
CRC-32: 13011738 13035175 13078075 13018300 13016409 13012178 13017059 13025536 13027152 13021277| 13011738 [10660795]
Murmur2: 12893240 12888365 13509553 13600492 12908274 12913065 12885432 12868505 12875917 12875665| 12868505 [10878271]
Murmur3: 12880812 12867415 12864890 12866987 12853259 12860248 13980900 13023273 13026888 12875726| 12853259 [10877179]
XXHfast32: 13801264 13767499 13761829 13756610 13766566 13758812 13761794 13768001 13776786 15203611| 13756610 [10891559]
XXHstrong32: 14176499 14195220 14194306 14182110 14183905 14185301 14182030 14187509 14188826 14206761| 14176499 [10891549]
iSCSI CRC: 9626988 9597179 10460505 10169387 9594326 9588778 9594630 9599860 9590339 9594640| 9588778 [10693843]
D:\Night_Light_Sky_hash_package_r4\PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3>hash_ICLv19_64bit.exe enwiki-20190920-pages-articles.xml.SORTED.wrd /s27
42206534 lines read
134217728 elements in the table (27 bits)
Jesteress: 10154456 9688188 9437936 9287023 9243282 9203643 9164546 9145027 9155232 9152206| 9145027 [6011292]
Meiyan: 9384260 9388744 9371441 9375850 9376204 9380414 9899733 10242612 9377134 9381765| 9371441 [5985680]
Yorikke: 9296395 9284590 9269714 9266270 9261058 9274190 9273933 9271189 9275876 9273868| 9261058 [6011605]
Yoshimura: 9592393 9588569 9587825 9593292 9584697 10540480 9900579 9613069 9605577 9589544| 9584697 [5991798]
wyhash: 11226650 11226541 11229898 11229313 11236958 11238773 11224795 11234102 11236831 11240919| 11224795 [5991525]
YoshimitsuTRIAD: 10125027 10804008 10864559 10114248 10121788 10105874 10105316 10112851 10105426 10110873| 10105316 [5992635]
FNV-1a: 11975264 11974477 12164543 12316669 11976744 11990144 12002638 13005282 12188342 12090023| 11974477 [5980248]
Larson: 10953186 10949675 10955563 10950824 10940314 10945093 10938971 10944415 10940195 10946634| 10938971 [5937238]
CRC-32: 11518002 11557842 11822789 12459454 11502872 11514100 11514422 11511754 11512550 11507978| 11502872 [5843653]
Murmur2: 11312903 11323922 11312405 11318728 11339395 11333358 11340361 11335791 12597315 11338909| 11312405 [5991065]
Murmur3: 11314261 11312490 11302498 11305907 11318678 11319903 11308196 11323282 11338886 11369356| 11302498 [5992379]
XXHfast32: 11999010 11993709 11993828 12901100 12165832 11996530 11980496 11983893 11972765 11990793| 11972765 [6008154]
XXHstrong32: 12336004 12344111 12393137 12320395 12327650 12321749 12336500 12940489 13045289 12324731| 12320395 [6007552]
iSCSI CRC: 8424970 8422112 8426119 8426210 8407128 8413809 8427064 8433463 8433521 8420233| 8407128 [5803092]
D:\Night_Light_Sky_hash_package_r4\PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3>hash_ICLv19_64bit.exe enwiki-20190920-pages-articles.xml.SORTED.wrd /s28
42206534 lines read
268435456 elements in the table (28 bits)
Jesteress: 9795080 9036369 8880676 8736655 8593291 8594901 8522269 8513670 8471662 8486710| 8471662 [3158163]
Meiyan: 8686389 8684876 8673352 8668943 8673384 8666803 8670208 8971181 9589229 8713297| 8666803 [3146234]
Yorikke: 8586542 8590898 8591765 8604435 8589613 8618255 8594603 8588334 8585479 8586700| 8585479 [3159537]
Yoshimura: 8890153 8885603 8889699 8915847 8890087 8889902 8892359 9686284 9332978 8887903| 8885603 [3150707]
wyhash: 10457002 10457989 10479433 10459843 10450571 10453057 10456976 10449596 10450858 10446311| 10446311 [3150048]
YoshimitsuTRIAD: 9324003 9318424 9322975 9316341 9501320 10226024 9313668 9329901 9338188 9321114| 9313668 [3151601]
FNV-1a: 11166873 11170738 11169114 11163723 11172638 11169328 11271365 11167598 11177998 11169619| 11163723 [3137380]
Larson: 10086030 11150598 10094821 10041636 10002501 10003237 10007298 10002717 10005074 10003688| 10002501 [3124638]
CRC-32: 10867057 10872707 10866162 10873237 10876833 10878200 10874804 11458930 11650368 10877934| 10866162 [3309362]
Murmur2: 10517052 10525693 10516209 10519048 10512587 10526034 10516321 10514776 10514596 10509813| 10509813 [3148320]
Murmur3: 10529271 10521854 10532782 10744760 11351694 10531945 10536316 10522240 10526296 10521130| 10521130 [3149002]
XXHfast32: 11097653 11201579 11097112 11088444 11097478 11101079 11550432 11383476 11123050 11438840| 11088444 [3168175]
XXHstrong32: 12134045 11408860 11402171 11411035 11450937 11405622 11399361 11555142 12101953 12041288| 11399361 [3168506]
iSCSI CRC: 8328571 8381078 8457800 8368526 8365507 8110069 8652710 8164213 7938673 7935019| 7935019 [3228134]
D:\Night_Light_Sky_hash_package_r4\PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3>hash_ICLv19_64bit.exe enwiki-20190920-pages-articles.xml.SORTED.wrd /s29
42206534 lines read
536870912 elements in the table (29 bits)
Jesteress: 13062895 12613294 13008340 10659956 9278853 8795097 8451580 8405148 8268046 8182970| 8182970 [1637522]
Meiyan: 8334309 8317909 8334519 8321467 8311994 8309644 8303182 8306182 8299977 8299900| 8299900 [1623134]
Yorikke: 8259958 9116407 8666298 8254715 8240338 8240933 8231891 8277877 8246341 8248561| 8231891 [1627004]
Yoshimura: 8500137 8512369 8514043 8497663 8514562 8528520 8527830 8512007 8515340 8526432| 8497663 [1616784]
wyhash: 10331570 10457854 10241986 10023883 10004950 10027268 10002384 10015593 10010881 10015608| 10002384 [1617472]
YoshimitsuTRIAD: 8890802 8882529 8888671 8883354 8890316 8887423 8920263 8901892 8890592 9428412| 8882529 [1617053]
FNV-1a: 10952021 10730201 10729431 10737144 10741592 10791088 10734004 10740518 10739827 10733225| 10729431 [1605297]
Larson: 9491802 9513207 9507931 9493867 9495600 10003595 10077102 9500898 9487958 9483457| 9483457 [1603852]
CRC-32: 10491797 10492126 10490514 10487282 10488361 10488084 10500599 10521403 10489692 10491394| 10487282 [1746537]
Murmur2: 10058272 10155886 11138974 10063703 10066475 10062742 10074000 10070798 10069166 10068810| 10058272 [1613822]
Murmur3: 10078031 10100332 10097252 10082640 10078293 10073529 10099597 10064971 10448061 10719211| 10064971 [1613870]
XXHfast32: 10615507 10603967 10606787 10601917 10606110 10606857 10618247 10645440 10617309 10603447| 10601917 [1634444]
XXHstrong32: 10915979 10936752 10919867 10925651 11329900 11477240 10936162 11205802 11456829 11518315| 10915979 [1634696]
iSCSI CRC: 8062816 8100808 8096566 8078880 8067651 7818158 7681320 7681184 7680553 7681214| 7680553 [1610608]
D:\Night_Light_Sky_hash_package_r4\PeterK_strchr.com_iSCSI-CRC_vs_WYHASH_vs_FNV1A-Yorikke-v3>
As you can see, one of the included benchmarks (testing 128 bytes long keys) shows that FNV1A_Yorikke_v3 fills the hash-table before Castagnoli (iSCSI)'s CRC32:
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,011,274,289,153; 000,000,001 x MAXcollisionsAtSomeSlots = 000,053; HASHfreeSLOTS = 0,000,000,000
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,011,274,289,153; 000,000,002 x MAXcollisionsAtSomeSlots = 000,053; HASHfreeSLOTS = 0,000,000,002
This is not as important as the 'MAXcollisionsAtSomeSlots' metric, it is the second most important metric, only next to the hash speed. The full dump is at the bottom as an appendix.
When superfast lookuping is needed, in my view, current best according to my experience is SSE4.2 iSCSI-CRC, next to it stands my Cinderella Lookuperess FNV1A-Yorikke - she dusts 'em off. Is this really so?! She is so poor... and fails all tests, except when hashing tiny keys in real environment of a real tool. Soon will share 'Lookuperorama' (Look-uper-o-rama) - a simple exhaustive benchmark (no one has such) hashing all positions of a given file, keys will be 4,6,8,10,12,14,16,18,36,64 bytes long, it will report the speed for completing hashing of each order and how many slots are used i.e. the hash-table utilization in percents (the-higher-the-better). The hash-table (in bits) will be configurable, thus 20..29 bit will be examined. Hopefully, it will answer definitively what performer is fastest in such cases.
The table below gives a strong metric - cycles/hash, however AFAIU it says little about hashing small keys which are packed/adjacent (one after another) thus cached, when inlined small functions can avoid overheads/penalties.
Let's see THE roster (sorted by 3rd column), maintained by Reini Urban at github...
Hash function MiB/sec cycles/hash Quality problems
wyhash 16528.58 17.67
wyhash32lo 15933.47 17.77
fletcher2 26241.42 19.01 fails all tests
fibonacci 20706.41 19.38 zeros, fails all tests
fletcher4 9526.54 19.53 fails all tests
FNV1a_YT 15425.31 21.51 fails all tests
pair_multiply_shift 21763.98 22.70 fails all tests
crc64_hw 10181.36 23.46 insecure, 100% bias, collisions, distrib, machine-specific (x86_64 SSE4.2)
crc32_hw 9310.60 24.63 insecure, 100% bias, collisions, distrib, machine-specific (x86 SSE4.2)
FarmHash32 24831.45 24.99 machine-specific (x86_64 SSE4/AVX)
farmhash32_c 24647.21 25.36 machine-specific (x86_64 SSE4/AVX)
xxh128low 43661.23 25.86 Moment Chi2 14974 !
xxh3 43021.12 26.00 Moment Chi2 14974 !
xxh3low 37670.92 26.39 Moment Chi2 1.8e+9 !
FNV1A-Yorikke ? 26.74 fails all tests, measured by wangyi-fudan at https://github.com/wangyi-fudan/wyhash/issues/29#issuecomment-538194565
xxh128 44407.83 26.89
Crap8 3962.47 26.98 2.42% bias, collisions, 2% distrib
xxh3high 45932.74 27.29 - " -
t1ha1_64le 16255.08 27.63
FNV2 7885.43 28.71 fails all tests
xxh128high 41762.05 28.81 - " -
t1ha1_64be 12285.15 28.84
City64noSeed 14124.43 29.41
MUM 12790.65 29.63 machine-specific (32/64 differs)
jodyhash64 3764.44 30.13 bias, collisions, distr
lookup3 3133.07 30.65 28% bias, collisions, 30% distr
crc32_hw1 30145.28 30.98 insecure, 100% bias, collisions, distrib, machine-specific (x86 SSE4.2)
Murmur2 3712.67 31.32 1.7% bias, 81x coll, 1.7% distrib
Murmur2C 5050.30 34.10 91% bias, collisions, distr
Murmur2B 7336.97 34.43 1.8% bias, collisions, 3.4% distrib
jodyhash32 1864.24 34.43 bias, collisions, distr
superfast 2918.47 34.62 91% bias, 5273.01x collisions, 37% distr
MUMlow 12973.97 34.67
Murmur2A 3875.69 34.80 12.7% bias
fasthash64 7020.23 35.51 Moment Chi2 5159 !
t1ha0_aes_noavx 21264.27 35.63 machine-specific (x86 AES-NI)
MUMhigh 12465.58 35.64
t1ha0_aes_avx1 20443.32 36.05 machine-specific (x64 AVX)
t1ha2_atonce 14747.01 36.09
t1ha0_aes_avx2 36436.51 36.31 machine-specific (x64 AVX2)
fasthash32 6693.98 36.67
cmetrohash64_1 17094.64 36.85 LongNeighbors
xxHash32 7297.39 36.91 LongNeighbors, collisions with 4bit diff
t1ha0_32le 8866.04 36.95
cmetrohash64_1o 15997.88 37.07 LongNeighbors
metrohash64_1 15491.63 37.56 LongNeighbors
metrohash64_2 16316.71 37.82 LongNeighbors
Murmur3F 6853.24 38.15
t1ha0_32be 7859.07 38.63
Murmur3A 3166.17 38.70 Moment Chi2 69
cmetrohash64_2 15952.55 38.87 LongNeighbors
metrohash64crc_2 26450.83 39.74 cyclic collisions 8 byte, machine-specific (x64 SSE4.2)
City64 13964.74 39.84 2 minor collisions
City32 5802.91 40.73
metrohash64crc_1 25856.64 41.24 cyclic collisions 8 byte, machine-specific (x64 SSE4.2)
farmhash64_c 14967.76 42.01
multiply_shift 5266.99 42.03 fails all tests
FarmHash64 14899.89 42.41
metrohash128_1 15902.48 43.79 LongNeighbors
xxHash64 14879.09 44.11
PMurHash32 3070.82 44.13 Moment Chi2 69
City64low 13888.28 45.66
City64high 14340.83 45.69
City128 16000.61 45.74
bernstein 1261.71 46.20 fails all tests
metrohash128_2 16374.31 46.21 LongNeighbors
Spooky64 14839.81 46.62
Spooky128 14833.63 47.50
Spooky32 14213.99 48.03
CityCrc128 19348.29 48.34
Murmur3C 3404.34 48.65 LongNeighbors
metrohash128crc_1 25404.51 49.07 machine-specific (x64 SSE4.2)
metrohash128crc_2 25248.70 49.57 machine-specific (x64 SSE4.2)
t1ha2_atonce128 14007.67 50.51 LongNeighbors
GoodOAAT 1237.86 52.75
x17 1174.99 53.62 99.98% bias, fails all tests
sdbm 929.94 54.35 fails all tests
FNV1a 937.85 56.63 zeros, fails all tests
FNV64 893.70 56.94 fails all tests
clhash 19322.99 57.17 machine-specific (x64 SSE4.2)
FarmHash128 15998.86 58.12
farmhash128_c 15097.31 61.00
MicroOAAT 819.52 63.24 100% bias, distrib
JenkinsOOAT_pl 741.41 71.78 1.5-11.5% bias, 7.2x collisions
MurmurOAAT 669.46 74.54 collisions, 99.998% distr
hasshe2 2054.39 76.60 insecure, fails all tests
HighwayHash64 14997.76 78.50
HalfSipHash 1105.93 79.31 zeroes
t1ha2_stream 6376.62 82.41
SipHash13 2124.26 84.20 0.9% bias
JenkinsOOAT 736.83 86.43 53.5% bias, fails all tests
crc32 544.84 92.65 insecure, 8589.93x collisions, distrib
t1ha2_stream128 7274.53 93.11 LongNeighbors
falkhash 37742.94 108.59 LongNeighbors, machine-specific (x86_64 AES-NI)
SipHash 1124.24 115.72
md5_32a 399.30 550.28 8589.93x collisions, distrib
sha1_32a 648.72 850.86 collisions, 36.6% distrib
Credit: https://github.com/rurban/smhasher
In my view, 'Yorikke' is the Cinderella of hash-lookup-functions, (it is being looked down upon), like 'cinder', 'dust' is also appliable, thus 'Dustella' comes dispersing - dispersion being the the process of fine-granularity scattering :P In Bulgarian, we have powerful-n-earpetting diminutives but also extra-nice double diminutives, as: Dustella - Прах[ол]яшка/Прах[ол]яшчица Cinderella - Пепеляшка/Пепеляшчица
The 'Прахоляшка' assembler:
// http://gcc.godbolt.org x86-64 gcc 8.3, -O3
//
FNV1A_Hash_Yorikke_v3:
cmp esi, 8
jbe .L4
lea ecx, [rsi-9]
shr ecx, 3
mov eax, ecx
lea rdx, [rdi+8+rax*8]
mov eax, -2128831035
.L3:
ror eax, 5
xor eax, DWORD PTR [rdi]
add rdi, 8
imul eax, eax, 591798841
ror eax, 5
xor eax, DWORD PTR [rdi-4]
imul eax, eax, 591798841
cmp rdi, rdx
jne .L3
neg ecx
ror eax, 5
lea esi, [rsi-8+rcx*8]
.L2:
mov ecx, 8
mov rdx, QWORD PTR [rdx]
sub ecx, esi
sal ecx, 3
sal rdx, cl
shr rdx, cl
xor eax, edx
shr rdx, 32
imul eax, eax, 591798841
ror eax, 5
xor eax, edx
imul eax, eax, 591798841
mov edx, eax
shr edx, 16
xor eax, edx
ret
.L4:
mov rdx, rdi
mov eax, 738780398
jmp .L2
https://gcc.godbolt.org/z/804x1o Poetry in action, these verses invoke underdogish contemplations...
Just try to replace your function with it and tell me (at sanmayce@sanmayce.com) Yorikke is not faster. Enfun!
Appendix: And the 'Knight-Tour' console dump:
E:\Night_Light_Sky_hash_package_r4>Knight-Tour_FNV1A_Yorikke3_vs_CRC32_TRISMUS.exe a8 4000000000
Knight-Tour_FNV1A_Yorikke3_vs_CRC32_TRISMUS, subrevision Efix, written by Kaze (based on Kurt White's code), downloadable at www.sanmayce.com/Fastest_Hash
Purpose: to compare FNV1A_Yorikke3 and CRC32 by giving the highest number of collisions i.e. the deepest nest/layer, the-lesser-the-better.
Note: In this subrevision a KT is transformed to lowercase at each position ONCE, KT is transformed to lowercase and then to uppercase at each position ONCE,
and these two 2x64 sequences reversed, i.e. all the 4x64 combinations.
Thus excluding the original KT we can hash 1+ trillion 1Kb UNIQUE chunks by having only 4 billion KTs.
Example: D:\>Knight-Tour_FNV1A_Yorikke3_vs_CRC32_TRISMUS a8 4000000000
Polynomial used:
CRC32: 0x8F6E37A0
KEYS to be hashed = 4,000,000,000x4x64
HashSizeInBits = 29
ReportAtEvery = 536,870,911
Allocating HASH memory 2048MB ... OK
Allocating HASH memory 2048MB ... OK
The first KT:
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
gives following 4x64 UNIQUE derivatives:
a8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8c7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7e8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8g7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7h5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5g3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3h1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1f2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2h3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3g1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1e2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2c1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1a2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2b4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4a6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6b8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8d7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7f8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8h7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7g5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5f7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7h8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8g6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6h4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4g2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2e1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1c2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2a1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1b3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3a5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5b7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7d8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8c6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6a7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7c8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8e7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7g8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8h6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6g4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4h2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2f1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1d2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2b1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1a3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3b5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5d6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6f5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5d4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4f3E5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3e5C4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5c4B2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4b2D3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2d3F4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3f4E6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4e6C5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6c5A4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5a4B6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4b6D5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6d5F6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5f6E4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6e4C3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4c3D1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3d1E3
A8C7E8G7H5G3H1F2H3G1E2C1A2B4A6B8D7F8H7G5F7H8G6H4G2E1C2A1B3A5B7D8C6A7C8E7G8H6G4H2F1D2B1A3B5D6F5D4F3E5C4B2D3F4E6C5A4B6D5F6E4C3D1e3
e3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3d1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1c3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3e4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4f6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6d5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5b6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6a4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4c5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5e6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6f4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4d3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3b2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2c4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4e5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5f3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3d4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4f5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5d6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6b5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5a3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3b1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1d2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2f1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1h2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2g4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4h6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6g8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8e7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7c8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8a7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7c6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6d8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8b7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7a5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5b3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3a1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1c2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2e1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1g2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2h4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4g6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6h8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8f7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7g5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5h7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7f8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8d7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7b8A6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8a6B4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6b4A2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4a2C1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2c1E2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1e2G1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2g1H3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1h3F2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3f2H1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2h1G3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1g3H5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3h5G7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5g7E8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7e8C7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8c7A8
E3D1C3E4F6D5B6A4C5E6F4D3B2C4E5F3D4F5D6B5A3B1D2F1H2G4H6G8E7C8A7C6D8B7A5B3A1C2E1G2H4G6H8F7G5H7F8D7B8A6B4A2C1E2G1H3F2H1G3H5G7E8C7a8
A8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8C7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7E8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8G7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7H5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5G3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3H1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1F2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2H3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3G1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1E2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2C1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1A2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2B4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4A6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6B8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8D7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7F8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8H7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7G5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5F7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7H8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8G6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6H4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4G2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2E1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1C2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2A1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1B3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3A5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5B7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7D8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8C6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6A7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7C8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8E7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7G8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8H6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6G4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4H2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2F1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1D2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2B1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1A3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3B5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5D6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6F5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5D4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4F3e5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3E5c4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5C4b2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4B2d3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2D3f4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3F4e6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4E6c5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6C5a4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5A4b6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4B6d5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6D5f6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5F6e4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6E4c3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4C3d1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3D1e3
a8c7e8g7h5g3h1f2h3g1e2c1a2b4a6b8d7f8h7g5f7h8g6h4g2e1c2a1b3a5b7d8c6a7c8e7g8h6g4h2f1d2b1a3b5d6f5d4f3e5c4b2d3f4e6c5a4b6d5f6e4c3d1E3
E3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3D1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1C3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3E4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4F6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6D5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5B6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6A4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4C5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5E6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6F4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4D3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3B2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2C4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4E5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5F3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3D4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4F5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5D6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6B5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5A3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3B1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1D2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2F1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1H2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2G4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4H6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6G8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8E7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7C8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8A7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7C6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6D8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8B7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7A5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5B3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3A1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1C2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2E1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1G2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2H4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4G6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6H8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8F7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7G5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5H7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7F8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8D7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7B8a6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8A6b4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6B4a2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4A2c1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2C1e2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1E2g1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2G1h3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1H3f2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3F2h1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2H1g3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1G3h5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3H5g7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5G7e8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7E8c7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8C7a8
e3d1c3e4f6d5b6a4c5e6f4d3b2c4e5f3d4f5d6b5a3b1d2f1h2g4h6g8e7c8a7c6d8b7a5b3a1c2e1g2h4g6h8f7g5h7f8d7b8a6b4a2c1e2g1h3f2h1g3h5g7e8c7A8
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,000,536,870,913; 000,000,002 x MAXcollisionsAtSomeSlots = 000,012; HASHfreeSLOTS = 0,198,277,566
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,000,536,870,913; 000,000,006 x MAXcollisionsAtSomeSlots = 000,011; HASHfreeSLOTS = 0,198,276,866
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,001,073,741,825; 000,000,002 x MAXcollisionsAtSomeSlots = 000,015; HASHfreeSLOTS = 0,073,230,007
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,001,073,741,825; 000,000,002 x MAXcollisionsAtSomeSlots = 000,015; HASHfreeSLOTS = 0,073,244,426
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,001,610,612,737; 000,000,009 x MAXcollisionsAtSomeSlots = 000,017; HASHfreeSLOTS = 0,027,044,817
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,001,610,612,737; 000,000,008 x MAXcollisionsAtSomeSlots = 000,017; HASHfreeSLOTS = 0,027,040,050
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,002,147,483,649; 000,000,005 x MAXcollisionsAtSomeSlots = 000,020; HASHfreeSLOTS = 0,009,990,734
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,002,147,483,649; 000,000,002 x MAXcollisionsAtSomeSlots = 000,021; HASHfreeSLOTS = 0,009,984,405
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,002,684,354,561; 000,000,001 x MAXcollisionsAtSomeSlots = 000,024; HASHfreeSLOTS = 0,003,688,881
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,002,684,354,561; 000,000,006 x MAXcollisionsAtSomeSlots = 000,022; HASHfreeSLOTS = 0,003,685,345
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,003,221,225,473; 000,000,001 x MAXcollisionsAtSomeSlots = 000,026; HASHfreeSLOTS = 0,001,362,534
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,003,221,225,473; 000,000,004 x MAXcollisionsAtSomeSlots = 000,025; HASHfreeSLOTS = 0,001,360,645
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,003,758,096,385; 000,000,004 x MAXcollisionsAtSomeSlots = 000,027; HASHfreeSLOTS = 0,000,503,872
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,003,758,096,385; 000,000,002 x MAXcollisionsAtSomeSlots = 000,027; HASHfreeSLOTS = 0,000,503,254
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,004,294,967,297; 000,000,001 x MAXcollisionsAtSomeSlots = 000,029; HASHfreeSLOTS = 0,000,186,050
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,004,294,967,297; 000,000,012 x MAXcollisionsAtSomeSlots = 000,028; HASHfreeSLOTS = 0,000,186,588
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,004,831,838,209; 000,000,001 x MAXcollisionsAtSomeSlots = 000,032; HASHfreeSLOTS = 0,000,069,262
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,004,831,838,209; 000,000,002 x MAXcollisionsAtSomeSlots = 000,031; HASHfreeSLOTS = 0,000,068,816
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,005,368,709,121; 000,000,002 x MAXcollisionsAtSomeSlots = 000,034; HASHfreeSLOTS = 0,000,025,646
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,005,368,709,121; 000,000,010 x MAXcollisionsAtSomeSlots = 000,032; HASHfreeSLOTS = 0,000,025,454
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,005,905,580,033; 000,000,005 x MAXcollisionsAtSomeSlots = 000,035; HASHfreeSLOTS = 0,000,009,394
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,005,905,580,033; 000,000,002 x MAXcollisionsAtSomeSlots = 000,035; HASHfreeSLOTS = 0,000,009,382
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,006,442,450,945; 000,000,002 x MAXcollisionsAtSomeSlots = 000,037; HASHfreeSLOTS = 0,000,003,452
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,006,442,450,945; 000,000,002 x MAXcollisionsAtSomeSlots = 000,037; HASHfreeSLOTS = 0,000,003,356
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,006,979,321,857; 000,000,001 x MAXcollisionsAtSomeSlots = 000,040; HASHfreeSLOTS = 0,000,001,274
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,006,979,321,857; 000,000,002 x MAXcollisionsAtSomeSlots = 000,039; HASHfreeSLOTS = 0,000,001,192
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,007,516,192,769; 000,000,002 x MAXcollisionsAtSomeSlots = 000,042; HASHfreeSLOTS = 0,000,000,480
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,007,516,192,769; 000,000,006 x MAXcollisionsAtSomeSlots = 000,040; HASHfreeSLOTS = 0,000,000,442
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,008,053,063,681; 000,000,004 x MAXcollisionsAtSomeSlots = 000,043; HASHfreeSLOTS = 0,000,000,183
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,008,053,063,681; 000,000,002 x MAXcollisionsAtSomeSlots = 000,042; HASHfreeSLOTS = 0,000,000,156
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,008,589,934,593; 000,000,003 x MAXcollisionsAtSomeSlots = 000,045; HASHfreeSLOTS = 0,000,000,067
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,008,589,934,593; 000,000,002 x MAXcollisionsAtSomeSlots = 000,044; HASHfreeSLOTS = 0,000,000,048
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,009,126,805,505; 000,000,003 x MAXcollisionsAtSomeSlots = 000,046; HASHfreeSLOTS = 0,000,000,022
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,009,126,805,505; 000,000,002 x MAXcollisionsAtSomeSlots = 000,046; HASHfreeSLOTS = 0,000,000,018
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,009,663,676,417; 000,000,001 x MAXcollisionsAtSomeSlots = 000,048; HASHfreeSLOTS = 0,000,000,006
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,009,663,676,417; 000,000,002 x MAXcollisionsAtSomeSlots = 000,047; HASHfreeSLOTS = 0,000,000,012
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,010,200,547,329; 000,000,002 x MAXcollisionsAtSomeSlots = 000,050; HASHfreeSLOTS = 0,000,000,002
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,010,200,547,329; 000,000,004 x MAXcollisionsAtSomeSlots = 000,048; HASHfreeSLOTS = 0,000,000,004
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,010,737,418,241; 000,000,001 x MAXcollisionsAtSomeSlots = 000,052; HASHfreeSLOTS = 0,000,000,001
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,010,737,418,241; 000,000,004 x MAXcollisionsAtSomeSlots = 000,049; HASHfreeSLOTS = 0,000,000,004
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,011,274,289,153; 000,000,001 x MAXcollisionsAtSomeSlots = 000,053; HASHfreeSLOTS = 0,000,000,000
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,011,274,289,153; 000,000,002 x MAXcollisionsAtSomeSlots = 000,053; HASHfreeSLOTS = 0,000,000,002
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,011,811,160,065; 000,000,002 x MAXcollisionsAtSomeSlots = 000,055; HASHfreeSLOTS = 0,000,000,000
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,011,811,160,065; 000,000,004 x MAXcollisionsAtSomeSlots = 000,054; HASHfreeSLOTS = 0,000,000,002
FNV1A_Yorikke_v3 : KT_DumpCounter = 0,012,348,030,977; 000,000,003 x MAXcollisionsAtSomeSlots = 000,056; HASHfreeSLOTS = 0,000,000,000
CRC32 0x8F6E37A0, iSCSI: KT_DumpCounter = 0,012,348,030,977; 000,000,002 x MAXcollisionsAtSomeSlots = 000,055; HASHfreeSLOTS = 0,000,000,000
^CTerminate batch job (Y/N)? Y
E:\Night_Light_Sky_hash_package_r4>
The first run of my superinformative 'Look-up-er-o-rama' benchmark is done for the immortal classic '1001 Nights' - it answers many questions by hashing all Building-Blocks of a given file and reporting hashing speeds/collisions for small keys IN REAL ENVIRONMENT not in a synthetic one.
The bottom-line, first: WYHASH overpowers Yorikke (both in hashing speed and dispersion departments), slightly, though. Glad for 王一 Wang Yi’s success, really impressive!
Note1: The teststand is this, each chunk (i.e. key or Building-Block) is hashed to its own hash-table of size 24bit, thus, all the 10 chunksizes occupy in total 10x2^24 slots. Note2: For more stable results, the affinity to one core was enforced, also the REAL-TIME priority. Note3: Number Of Hash Collisions = Distinct WORDs - Number Of Trees, where 'WORDs' equals 'KEYs', 'Trees' equals 'Used Slots'. The last column is CUMULATIVE! Note4: The full console log is included, obtained on laptop running Windows 10, i7-3630QM 3.4GHz 16GB DDR3 1600MHz:
For Number Of Bits (Slots=1<<Bits): 24, meaning 10x2^24 total slots in 10 hashtables or 10 x 16,777,216
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Hasher / Speed in Keys/s for | 4 bytes | 6 bytes | 8 bytes | 10 bytes | 12 bytes | 14 bytes | 16 bytes | 18 bytes | 36 bytes | 64 bytes | Collisions, all ten Hash-Tables |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| FNV1A-Jesteress (Intel v19.0) | 09,679,153 | 07,025,894 | 06,068,315 | 05,191,016 | 04,838,071 | 04,830,572 | 04,830,571 | 04,692,388 | 04,232,320 | 03,986,537 | 23,986,161 |
| FNV1A-Jesteress (GCC v7.3.0) | 11,877,619 | 07,224,587 | 06,347,630 | 04,829,076 | 05,059,554 | 04,715,106 | 05,099,288 | 04,475,423 | 03,910,515 | 03,482,318 | 23,986,161 |
| FNV1A-Yorikke (Intel v19.0) | 10,557,884 | 07,590,567 | 06,614,360 | 05,185,833 | 05,012,360 | 04,926,786 | 04,869,820 | 04,681,112 | 03,955,178 | 03,658,928 | 23,750,661 |
| FNV1A-Yorikke (GCC v7.3.0) | 11,725,686 | 07,099,514 | 06,063,592 | 05,264,672 | 04,509,094 | 04,598,237 | 05,018,816 | 04,382,289 | 03,826,026 | 03,317,729 | 23,750,661 |
| WYHASH (Intel v19.0) | 10,658,985 | 07,378,520 | 05,257,568 | 04,928,346 | 04,937,715 | 04,821,604 | 04,835,068 | 04,675,494 | 04,227,727 | 04,017,369 | 23,738,215 |
| WYHASH (GCC v7.3.0) | 11,769,967 | 07,093,051 | 06,296,336 | 05,444,944 | 05,059,554 | 04,746,703 | 05,041,548 | 04,012,209 | 03,851,558 | 03,427,177 | 23,738,215 |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
For Number Of Bits (Slots=1<<Bits): 25, meaning 10x2^25 total slots in 10 hashtables or 10 x 33,554,432
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Hasher / Speed in Keys/s for | 4 bytes | 6 bytes | 8 bytes | 10 bytes | 12 bytes | 14 bytes | 16 bytes | 18 bytes | 36 bytes | 64 bytes | Collisions, all ten Hash-Tables |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| FNV1A-Jesteress (Intel v19.0) | 08,744,914 | 06,784,255 | 05,569,489 | 05,172,064 | 04,877,442 | 05,119,391 | 05,160,074 | 05,114,349 | 04,874,383 | 04,609,102 | 13,502,646 |
| FNV1A-Jesteress (GCC v7.3.0) | 10,897,508 | 06,775,406 | 06,030,740 | 05,345,945 | 05,059,554 | 04,710,830 | 05,069,429 | 04,383,522 | 04,051,847 | 03,565,174 | 13,502,646 |
| FNV1A-Yorikke (Intel v19.0) | 09,314,666 | 06,877,067 | 06,040,090 | 05,052,993 | 04,972,376 | 05,107,645 | 05,148,141 | 05,023,669 | 04,698,041 | 04,340,773 | 13,325,063 |
| FNV1A-Yorikke (GCC v7.3.0) | 10,472,739 | 06,319,316 | 04,765,575 | 05,250,482 | 04,956,561 | 04,661,509 | 05,012,359 | 04,335,955 | 03,955,178 | 03,346,226 | 13,325,063 |
| WYHASH (Intel v19.0) | 08,744,914 | 06,682,433 | 05,605,551 | 05,116,031 | 04,885,087 | 04,943,980 | 05,082,656 | 05,028,532 | 04,732,282 | 04,480,556 | 13,312,630 |
| WYHASH (GCC v7.3.0) | 10,529,349 | 05,909,531 | 05,054,632 | 05,254,022 | 04,989,890 | 04,726,547 | 05,044,812 | 04,328,728 | 03,979,419 | 03,484,654 | 13,312,630 |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
For Number Of Bits (Slots=1<<Bits): 26, meaning 10x2^25 total slots in 10 hashtables or 10 x 67,108,864
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Hasher / Speed in Keys/s for | 4 bytes | 6 bytes | 8 bytes | 10 bytes | 12 bytes | 14 bytes | 16 bytes | 18 bytes | 36 bytes | 64 bytes | Collisions, all ten Hash-Tables |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| FNV1A-Jesteress (Intel v19.0) | 06,901,433 | 05,254,023 | 04,821,606 | 04,334,751 | 04,335,956 | 04,671,291 | 04,577,974 | 05,033,405 | 05,007,520 | 04,650,366 | 7,220,918 |
| FNV1A-Jesteress (GCC v7.3.0) | 08,705,830 | 04,435,933 | 05,458,295 | 04,885,088 | 04,632,410 | 04,367,552 | 04,560,557 | 03,980,440 | 03,443,085 | 03,065,180 | 7,220,918 |
| FNV1A-Yorikke (Intel v19.0) | 07,251,483 | 05,236,369 | 05,289,692 | 04,688,156 | 04,836,570 | 04,936,150 | 05,012,359 | 04,977,139 | 04,821,598 | 04,400,840 | 7,083,196 |
| FNV1A-Yorikke (GCC v7.3.0) | 07,406,576 | 05,670,827 | 05,443,043 | 04,803,770 | 04,567,241 | 04,295,321 | 04,509,092 | 03,910,520 | 03,409,189 | 02,609,406 | 7,083,196 |
| WYHASH (Intel v19.0) | 06,796,091 | 05,204,888 | 04,875,917 | 04,761,207 | 04,783,127 | 04,854,650 | 04,970,789 | 04,980,320 | 04,891,213 | 04,556,542 | 7,069,716 |
| WYHASH (GCC v7.3.0) | 09,049,614 | 05,887,206 | 05,407,159 | 04,845,594 | 04,600,953 | 04,384,757 | 04,549,905 | 03,896,829 | 03,440,804 | 03,017,695 | 7,069,716 |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
The 'Lookuperorama' benchmark is downloadable (C source included) at: www.sanmayce.com/Fastest_Hash/Lookuperorama_r2.zip
The PDF booklet in 2 pages: www.sanmayce.com/Fastest_Hash/HASH-Showdown_2019-Oct-10.pdf
Brutal brutal speed, indeed.
I believe, the OP i.e threadstarter is about to get his question answered by hashing words, verses and fixed-length chunks, in the link below.
Dear Wang Yi, your wyhash is awesome, but not fastest for hash-table lookuping small keys: https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/824947#comment-1946707
Best to you, I feel the appreciative persons. Machinely yours, Sanmayce
@tansy
What would be representative set of strings to test the hash? I think the bench that I presented (hashing at each position different sizes) answered many questions related to your original one, where do you see irrelevance?!
And I see no sense in your proposition to compress a log (spam as you see it) and attach it - it would be spam, still, to people like you asking and complaining. Reaching certain clarity requires great many tests, but since you are the OP and you are unhappy, won't bother you again.
What would be representative set of strings to test the hash? Should they be long or short? I thought to run it million/billion times with that strings to see whether it is a difference between hashes for such operation.
I came up with more real life set of strings containing strings from single words to long sentences which goes like this:
# 1: top 1000 internet search terms @ 2008 max length: 57 avg length: 16.056
# 2: 1000 Most Asked Questions On Google max length: 45 avg length: 23.024
# 3: Most common passwords list max length: 9 avg length: 6.237
# 4: User:Adam78/List of tongue-twisters max length: 999 avg length: 72.465
# 5: Top 500 domains from Mozilla max length: 28 avg length: 11.808
Which gives almost 5000 strings. max length: 999 avg length: 31.211
I also thought about repo containg a list of the 10,000 most common English words in order of frequency but they are just single words which implies short length therefore they could supplement up to 5k and that's it.
What do you think?