I'm concerned about this....

If you are allocating memory on the heap it could get quite large (if the input dataset contains quite a few duplicates and isn't sorted).  Potentially you could be allocating more than 50 bytes per input row.

Anything that has the potential to be that large should be being allocated on the roxie heap.

A different alternative, which has a higher initial overhead, but better worse case behaviour is to have another "next" array.
When there is a clash you find a slot to fill, follow the chain, and update the next to point to the new item.

I think the lookup logic probably becomes simpler as well.