Я считаю, что это лучший из возможных хэшей для этой задачи (быстрее, чем по модулю, лучшее распределение), учитывая, что все ваши числа в 0..N имеют одинаковую вероятность:
h = z * n / N;
Где все значения являются целыми числами, поэтому у вас есть целочисленное деление. Таким образом, каждое значение между 0..N отображается на одно и то же количество значений в n.
Например, когда n = 3 и N = 7 (значения 3 и 7 не включены в диапазоны), хэши таковы:
z * n / N = hash
----------------
0 * 3 / 7 = 0
1 * 3 / 7 = 0
2 * 3 / 7 = 0
3 * 3 / 7 = 1
4 * 3 / 7 = 1
5 * 3 / 7 = 2
6 * 3 / 7 = 2
Таким образом, каждое значение хеш-функции используется одинаково часто, только на 1. Просто позаботьтесь, чтобы n*(N-1)
не переполнялось.
Если N является степенью 2, вы можете заменить деление на сдвиг. например если N = 256:
h = (z * n) >> 8;