If the three shorts are relatively evenly distributed, you can just use something like:
hashVal = (short1 xor short2 xor short3) modulo numBuckets
which will give you a short, reduced to a specific range from 0
to numBuckets - 1
.
Whether that's suitable or not depends a great deal on how your input values will be distributed and what you expect from your hashing function.
Based on your question edit stating that the hash must go into an unsigned int, and assuming a 16-bit short and 32-bit unsigned int, there's no way to avoid collisions totally (you'd need 48 bits for that). One possibility is to use:
hashVal = (x leftshift 16) logical-or (y leftshift 8) logical-or (z)
This will combine (with logical-or) your values thus:
xxxxxxxxxxxxxxxx0000000000000000
yyyyyyyyyyyyyyyy00000000
zzzzzzzzzzzzzzzz
and at least minimise the possibility of simular x/y/z
values affecting each other.
And, further to your comment:
I would expect my input values to be in the range of 0 to 512. How would that affect my decision?
If your input values are restricted to the range 0 through 512 (inclusive), you only need ten bits for each ( which will give you the values 0 through 1023). In that case, three of them will easily fit within a 32-bit unsigned integer, so you could use:
hashVal = (x leftshift 20) logical-or (y leftshift 10) logical-or (z)
This gives a perfect hash, with absolutely no chance of collisions.