Cuando trabajamos con colecciones de elementos, como una lista de cadenas o una lista de tuplas, buscar un elemento o responder consultas del tipo “¿Está el elemento X en nuestra colección?” puede ser muy costoso computacionalmente. Sin embargo, comparar números es muy rápido, y nuestras computadoras están especialmente diseñadas para hacerlo de manera muy eficaz (a diferencia de comparar cadenas o tuplas). Por lo tanto, si podemos asignar nuestros datos a un valor numérico, algunas operaciones, como encontrarlos o verificar si están en la colección, se vuelven mucho más ágiles.
La técnica que consiste en mapear datos de tamaño arbitrario a datos de tamaño fijo se llama hashing. El número resultante (hash) funciona como un identificador único de los datos originales. Normalmente contamos con una función hash que puede mapear los datos iniciales a un valor de tamaño fijo (como un número).
Por ejemplo, Python cuenta con una función incorporada llamada hash, que puede transformar cualquier objeto immutable en un número que, por lo general, cae dentro del rango . Es importante notar que solo puede trabajar con objetos inmutables. Por ello, si tratamos de hacer hash de una lista o un diccionario (objetos mutables a los que se les pueden agregar o quitar elementos), obtendremos un error:
Implemos una función de hash personalizada llamada h. Esta función recibirá un par de números enteros y deberá devolver su valor de hash. La función h se define como:
Esto garantiza que el valor de hash siempre permanezca en el rango [0; 5077).
Input
La única línea de la entrada contiene dos números a y b ( ≤ a, b ≤ ).