Optimize hashing

Amount of memory allocations almost halved, now it's mostly Map updates.

    Before:
        total time  =        8.71 secs   (8711 ticks @ 1000 us, 1 processor)
        total alloc = 12,220,615,792 bytes  (excludes profiling overheads)

    After:
        total time  =        5.02 secs   (5022 ticks @ 1000 us, 1 processor)
        total alloc = 7,753,908,480 bytes  (excludes profiling overheads)