But since almost every Vec2i gives me different Hashcodes, I won't have hash collisions
That is not how hash maps work. Different hashcodes will
cause hash collisions, unless your backing array has 4.2 billion entries.
And I diagree that LinkedLists are bad for everything
They are bad for everything. But let's not go there, as other threads have done so before.
Why don't you just use a List[w][h] ? It's so much better in every possible way. But it seems you have made up your mind, too bad, as the disadvantages have been explained already in this thread, and you just said 'no'. Oh well, in the end, it's about what works, not how it's done. So good luck with your game - if there's one in the making.
And as for tunneling / swept shapes: it's normally good enough to make your entities queries so fast, that you can simply iterate the movement of the shape within a single game tick. In games you don't need perfect solutions, so just moving a bullet with 100 positional updates (and querying for collisions) per tick will simply be enough. Another approach is to query series of overlapping bounding rectangles / circles along the movement vector and do a broad scan of potential colliders.
Nobody in their right minds will simulate more than 1 high speed colliding object, so don't even bother solving that problem. Complexity increases so rapidly that you can just as well write a scientific simulator, and ditch any plans for your game.