En este desafío de código , escribirá una función hash en 140 bytes 1 o menos del código fuente. La función hash debe tomar una cadena ASCII como entrada y devolver un entero sin signo de 24 bits ([0, 2 24 -1]) como salida.
Su función hash será evaluada para cada palabra en este gran diccionario de inglés británico 2 . Su puntaje es la cantidad de palabras que comparten un valor hash con otra palabra (una colisión).
El puntaje más bajo gana, lazos rotos por el primer cartel.
Caso de prueba
Antes de enviar, pruebe su secuencia de comandos de puntuación en la siguiente entrada:
duplicate
duplicate
duplicate
duplicate
Si le da un puntaje que no sea 4, tiene errores.
Reglas aclaratorias:
- Su función hash debe ejecutarse en una sola cadena, no en una matriz completa. Además, su función hash no puede hacer ninguna otra E / S que la cadena de entrada y el entero de salida.
- Las funciones hash incorporadas o una funcionalidad similar (por ejemplo, cifrado para codificar bytes) no está permitido.
- Su función hash debe ser determinista.
- Contrariamente a la mayoría de los otros concursos, se permite la optimización específica para la entrada de puntuación.
1 Sé que Twitter limita los caracteres en lugar de los bytes, pero por simplicidad usaremos bytes como límite para este desafío.
2 Modificado de wbritish-huge de Debian , eliminando cualquier palabra que no sea ASCII.
D=340275
palabras y R=2^24
salidas hash, un hash aleatorio tiene D^2/(2*R) = 3450
pares de colisión esperados , algunos de los cuales se superponen. Hay un D^3/(6*R^2) = 23
triple de colisión esperado y un número insignificante de colisiones más grandes, lo que significa que estos triples son probablemente disjuntos. Esto da unas 6829
palabras esperadas que comparten un valor hash, ~ 70
en triples y el resto en pares. La desviación estándar se estima en 118
, por lo que obtener <6200
un hash aleatorio es aproximadamente un evento de 5 sigma.
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch's
? Que...?