Neste desafio de código, você escreverá uma função de hash em 140 bytes 1 ou menos do código-fonte. A função hash deve receber uma sequência ASCII como entrada e retornar um número inteiro não assinado de 24 bits ([0, 2 24 -1]) como saída.
Sua função de hash será avaliada para cada palavra neste grande dicionário de inglês britânico 2 . Sua pontuação é a quantidade de palavras que compartilham um valor de hash com outra palavra (uma colisão).
A pontuação mais baixa ganha, empates quebrados pelo primeiro pôster.
Caso de teste
Antes de enviar, teste seu script de pontuação na seguinte entrada:
duplicate
duplicate
duplicate
duplicate
Se der uma pontuação diferente de 4, é de buggy.
Regras de esclarecimento:
- Sua função hash deve ser executada em uma única sequência, não em uma matriz inteira. Além disso, sua função hash pode não fazer nenhuma outra E / S além da sequência de entrada e do número inteiro de saída.
- Funções de hash embutidas ou funcionalidade semelhante (por exemplo, criptografia para embaralhar bytes) não são permitidas.
- Sua função de hash deve ser determinística.
- Ao contrário da maioria dos outros concursos, é permitido otimizar especificamente a entrada de pontuação.
1 Estou ciente de que o Twitter limita caracteres em vez de bytes, mas por simplicidade, usaremos bytes como limite para esse desafio.
2 Modificado a partir do wbritish-enorme do Debian , removendo quaisquer palavras não-ASCII.
D=340275
palavras e R=2^24
hash, um hash aleatório tem D^2/(2*R) = 3450
pares esperados de colisão, alguns dos quais se sobrepõem. Há uma D^3/(6*R^2) = 23
tripla esperada de colisão e um número insignificante de colisões maiores, o que significa que essas triplas provavelmente são desarticuladas. Isso fornece as 6829
palavras esperadas que compartilham um valor de hash, ~ 70
em triplos e o restante em pares. O desvio padrão é estimado em 118
, portanto, obter <6200
um hash aleatório é aproximadamente um evento 5 sigma.
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch's
? O que...?