¿Por qué algunas funciones hash usan un número primo como base? ¿Cuál es el significado de usar un número primo? ¿Es para asignar unicidad y minimizar la colisión de valores hash?

Usar un prime como radix, especialmente en Rabin-Karp, es muy popular pero totalmente incorrecto .

Lo que debería hacer en su lugar es usar un primo (aleatorio) como módulo , por ejemplo, como el tamaño de su tabla hash en una estructura de datos o como el rango de valores hash válidos en Rabin-Karp. En el hash de estilo Rabin-Karp, para cualquier raíz y para cualquiera de las dos cadenas diferentes, es probable que solo haya un pequeño número finito de módulos primos que producen una colisión. (Si considera las dos cadenas como números grandes, los números primos que producen una colisión son precisamente los números primos que dividen la diferencia de esos dos números). Casi todos los números primos descubrirán que las dos cadenas son distintas. Por lo tanto, un primo seleccionado al azar de un rango adecuado funcionará con una probabilidad muy alta.

(Debido a la paradoja del cumpleaños, si desea esperar cero colisiones, el tamaño de su prima para Rabin-Karp debe ser aproximadamente n ^ 2 o más, donde n es la longitud de la cadena de “pajar”).

Por otro lado, una mala implementación muy común de Rabin-Karp usa 2 ^ 32 (o 2 ^ 64) como módulo, y algunos primos como radix. ¿Por qué es mala esta implementación? Porque, por ejemplo, es posible construir dos (o incluso múltiples) cadenas diferentes de la misma longitud (muy pequeña) de modo que formen una colisión para cualquier raíz principal impar . Por lo tanto, no hay una función hash de este tipo incorrecto que realmente distinga entre esas dos cadenas. No importa cuán grandes primos intentes, no importa si eliges uno al azar, siempre tendrás una colisión.

Una alternativa a Rabin-Karp es la clase de funciones hash Carter-Wegman que SÍ utiliza primos que NO son aleatorios debido a sus propiedades matemáticas. La aleatorización se encuentra en el resto de la función. Si considera su entrada X como un número de r dígitos base-p (X1, X2, …, Xr), su función hash h se define mediante una secuencia aleatoria similar (A1, A2, …, Ar) y se calcula como

h (X): = A1X1 + A2X2 +… + ArXr mod p.

La ventaja de esta clase de funciones hash es que puede mostrar que para cualquier X, Y distinta en la entrada, Pr [h (X) = h (Y)] ≤1 / n cuando h se selecciona aleatoriamente de la clase. Esto es muy conveniente tanto para fines criptográficos como para hashing, por ejemplo. Puede leer más del libro sobre algoritmos de Jon Kleinberg y Éva Tardos, Capítulo 13.

Para los no primos con un factor pequeño, se borra el pasado. Por ejemplo, si hash con un número par, 2 es un factor, por lo que terminas cambiando los bits a la izquierda en cada paso, y después de 32 pasos, el primer bit que has perdido se pierde por completo, por lo que pierdes la información inicial. Para un número divisible por 3, lo mismo en la base tres, y así sucesivamente, entonces un primo te mantiene a salvo.

Tienes razón, esto es lo que me dijo mi instructor cuando me preguntaron lo mismo …
pero había tomado un pequeño curso sobre programación, solo mira lo que dicen los demás. Desde entonces, las colisiones menos efectivas son el uso de la lista vinculada.

More Interesting

¿Cuál es el mejor recurso para aprender sobre las pruebas de corrección para algoritmos?

¿Son defectuosos los números complejos?

Geometría: ¿Cómo se distribuye uniformemente (igualmente espacio) 36 puntos de ancho y un triángulo rectángulo isósceles? Sé cómo distribuir uniformemente los puntos a través de un rectángulo (coloque los puntos en 0 a la longitud del lado en incrementos de (longitud del lado) / (raíz (36)), pero ¿cómo haría uno para un triángulo?

Cómo resolver rápidamente cualquier problema

Cómo convertir -57.45 a doble precisión IEEE

¿Necesito ser bueno en matemáticas para aprender codificación?

En Python, ¿cómo sería el código si quisiera que el usuario ingrese un número de 3 dígitos y luego obtenga la suma de esos tres números individuales?

Para los usuarios, ¿se está volviendo Facebook más valioso, útil y digno de más tiempo invertido o menos? ¿Por qué? ¿Hay alguna evidencia de Facebook de que la Ley de Metcalfe es cierta (para n usuarios, el valor de la red aumenta en nxn)?

¿Cuál es la mejor manera de aprender geometría algebraica si uno no está interesado en usarlo para propósitos teóricos numéricos, sino más bien para aplicaciones en física teórica e informática teórica?

¿Cómo se puede saber el mejor lugar para colocar una pieza determinada en Tetris?

¿Cuáles son los conceptos matemáticos necesarios para la inclinación de la máquina y la programación?

¿Qué libro debo usar para preguntas y soluciones para matemáticas discretas?

¿Cuáles son tus 10 idiomas favoritos?

Dados N puntos en el plano, ¿qué es un algoritmo eficiente para encontrar todos los conjuntos de 3 o más puntos colineales?

¿Por qué 0 ^ 0 es igual a 1 en el estándar IEEE 754 aunque no tiene sentido?