This should've been a comment, but SE do not allow me to comment with low reps >_<
christopher-gallegos's variant may have some precision problems when uints are made of IEEE 754 float bits. I developed a shader and bumped into a situation when a little negative shift gave typical "granularity" of the surface. I tried to find out what's wrong with my code, but apparently it has no problems, uint to float conversion also works just fine. If anyone want to investigate further, please, make a comment to save time of future generations.
dividebyzero's variant and other hash funcs I was using worked fine for me in the same situation.