If the collision rules hash was off the entity struct, how would you look it up if you were checking collision for the _other_ entity in the pair?
Pairwise things usually do not want to "belong" to one entity or the other, but rather live at one level up, because it gives you more options.
As for function pointers, what would be the specific thing that would become easier as compared to a switch statement or series of ifs/checks/etc.?
- Casey