wangyi-fudan / wyhash

The FASTEST QUALITY hash function, random number generators (PRNG) and hash map.
The Unlicense
970 stars 73 forks source link

Representative set of test strings. #29

Closed tansy closed 4 years ago

tansy commented 5 years ago

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?

lemire commented 5 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

tansy commented 5 years ago

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.

cocowalla commented 5 years ago

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.

tansy commented 5 years ago

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.

Sanmayce commented 5 years ago

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
Sanmayce commented 5 years ago

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?

wangyi-fudan commented 5 years ago

ha, i just see that wyhash is almost slowest. However, I like your website very much. I sense great culture on it :-)

wangyi-fudan commented 5 years ago

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% !!!!!

Sanmayce commented 5 years ago

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.

Sanmayce commented 5 years ago

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>
Sanmayce commented 5 years ago

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

Sanmayce commented 5 years ago

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

Sanmayce commented 4 years ago

@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.