Básicamente, lo que estás tratando de lograr con una función hash es dar a todos los bits del código hash una probabilidad aproximada del 50% de que se active o desactive dado un elemento en particular que se va a aplicar.De esta forma, no importa cuántos "cubos" tenga tu tabla hash (o dicho de otra manera, cuántos bits inferiores tomas para determinar el número de cubeta) - si cada bit es tan aleatorio como posible, entonces un artículo siempre será asignado a un cubo esencialmente aleatorio.
Ahora, en la vida real, muchas personas usan funciones hash que no son tan buenas. Tienen algunos aleatoriedad en algunos de los bits, pero no en todos ellos. Por ejemplo, imagina que si tienes una función hash cuyos bits 6-7 son parciales, digamos en el típico código hash de un objeto, tienen un 75% de posibilidades de ser configurados. En este ejemplo inventado, si nuestra tabla de hash tiene 256 cubos (es decir, el número de cubeta proviene de los bits 0-7 del código hash), entonces estamos descartando la aleatoriedad que existe en los bits 8-31, y una menor la porción de los cubos tenderá a llenarse (es decir, aquellos cuyos números tienen los bits 6 y 7 establecidos).
La función hash suplementaria básicamente trata de propagar cualquier aleatoriedad que haya en los códigos hash en un mayor número de bits. Entonces, en nuestro ejemplo hipotético, la idea sería que parte de la aleatoriedad de los bits 8-31 se mezclaría con los bits inferiores, y diluiría el sesgo de los bits 6-7. Todavía no será perfecto, pero mejor que antes.
Una buena función hash también debe crear _muy_ hash diferentes para valores similares. Incluso si los elementos A y B difieren solo en un bit, sus valores hash deberían ser muy diferentes. – Piotr
Siempre me ha gustado este artículo: http: //www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx – Joe