La razón por la cual se usan números primos es para minimizar las colisiones cuando los datos exhiben algunos patrones particulares.
Lo primero es lo primero: si los datos son aleatorios, entonces no hay necesidad de un número primo, puede hacer una operación de modificación contra cualquier número y tendrá el mismo número de colisiones para cada valor posible del módulo.
Pero cuando los datos no son aleatorios, suceden cosas extrañas. Por ejemplo, considere los datos numéricos que siempre son múltiplos de 10.
Si usamos mod 4 encontramos:
10 mod 4 = 2
20 mod 4 = 0
30 mod 4 = 2
40 mod 4 = 0
50 mod 4 = 2
Entonces, de los 3 valores posibles del módulo (0,1,2,3) solo 0 y 2 tendrán colisiones, eso es malo.
Si usamos un número primo como 7:
10 mod 7 = 3
20 mod 7 = 6
30 mod 7 = 2
40 mod 7 = 4
50 mod 7 = 1
etc.
También notamos que 5 no es una buena opción, pero 5 es primo, la razón es que todas nuestras claves son múltiplos de 5. Esto significa que tenemos que elegir un número primo que no divida nuestras claves, elegir un número primo grande es generalmente suficiente.
Por lo tanto, al ser repetitivo, la razón por la que se usan los números primos es para neutralizar el efecto de los patrones en las teclas en la distribución de colisiones de una función hash.