La pregunta clave es cuál es su clave. (Sin juego de palabras.) Como han señalado otros, el objetivo es minimizar el número de colisiones hash. Si puede obtener el número de colisiones hash a cero, es decir, su función hash genera un valor único para cada clave que realmente le pase, tendrá un hash perfecto.
Tenga en cuenta que en Java, una función hash realmente tiene dos pasos: Primero la clave se ejecuta a través de la función hashCode para su clase. Luego calculamos un valor de índice en la tabla hash tomando este módulo de valor del tamaño de la tabla hash.
Creo que las personas que debaten sobre la función hash perfecta tienden a olvidar ese segundo paso. Incluso si escribiera una función hashCode que generara un valor único para cada clave que se le pasara, aún podría obtener un hash absolutamente terrible si este módulo de valor, el tamaño de la tabla hash, no es exclusivo. Por ejemplo, digamos que tiene 100 claves y su función hashCode devuelve los valores 1, 1001, 2001, 3001, 4001, 5001, ... 99001. Si su tabla hash tiene 100,000 ranuras, este sería un hash perfecto. Cada tecla tiene su propia ranura. Pero si tiene 1000 máquinas tragamonedas, todas se desplazan a la misma ranura. Sería el peor hash posible.
Considere la posibilidad de construir una buena función hash. Tome los casos extremos. Supongamos que tu clave es una cita. Usted sabe que las fechas serán todas en enero del mismo año. Luego, use el día del mes ya que el valor hash debe ser tan bueno como lo que va a obtener: todo se reducirá a un entero único en un rango pequeño. Por otro lado, si sus fechas fueron todas el primero del mes durante muchos años y muchos meses, tomar el día del mes sería un hash terrible, ya que cada tecla real se correlacionaría con "1".
Mi punto es que si realmente quiere optimizar su hash, necesita conocer la naturaleza de sus datos. ¿Cuál es el rango real de valores que obtendrá?
¿de qué tipo es su clave? – jjnguy
Publicando esto como un comentario porque realmente no responde su pregunta. Pero si está usando java.util.Hashtable, no. Use java.util.HashMap en su lugar –