edit: Nevermind, I was converting to Uint but should have been returning Int, this gives results in (-50,50).
Adding size / 2 will get you back to the range (0,size-1) that you would want for assigning buckets.
I was also going to ask you why it needed to be "decently uniform" but then implementing it saw that the first thousand numbers all hash to the same value.
In fact, the first 21,262,215 numbers all hash to the same value with size = 101.
Given that .net implements Int32.GetHashCode(value) as "return value"[1], I would avoid this trick in practice in .net.
Please correct me if I've stuffed up my implementation!
https://referencesource.microsoft.com/#mscorlib/system/int32...