Considere a lista com poucas ligações simples em um ambiente puramente funcional. Seus louvores foram cantados do topo das montanhas e continuarão sendo cantados. Aqui irei abordar um dos muitos pontos fortes e a questão de como ele pode ser estendido à classe mais ampla de sequências puramente funcionais baseadas em árvores.
O problema é o seguinte: Você deseja testar quase certa igualdade estrutural no tempo O (1) por meio de hash forte. Se a função hash for estruturalmente recursiva, ou seja, hash (x: xs) = mix x (hash xs), você poderá armazenar em cache de forma transparente valores de hash em listas e atualizá-los em O (1) quando um elemento for incluído em uma lista existente . A maioria dos algoritmos para listas de hash é estruturalmente recursiva; portanto, essa abordagem é eminentemente utilizável na prática.
Mas suponha que, em vez de listas vinculadas individualmente, você tenha sequências baseadas em árvore que suportam a concatenação de duas sequências de comprimento O (n) no tempo O (log n). Para que o cache de hash funcione aqui, a função de mistura de hash deve ser associativa para respeitar os graus de liberdade que uma árvore possui para representar a mesma sequência linear. O misturador deve pegar os valores de hash das subárvores e calcular o valor de hash de toda a árvore.
Era aqui que eu estava há seis meses, quando passei o dia pensando e pesquisando sobre esse problema. Parece não ter recebido atenção na literatura sobre estruturas de dados. Eu me deparei com o algoritmo de hash Tillich-Zemor da criptografia. Ele se baseia na multiplicação de matrizes 2x2 (que é associativa), onde os bits 0 e 1 correspondem aos dois geradores de uma subalgebra com entradas em um campo de Galois.
Minha pergunta é: o que eu perdi? Deve haver artigos relevantes na literatura sobre criptografia e estruturas de dados que não encontrei na minha pesquisa. Quaisquer comentários sobre esse problema e possíveis locais a serem explorados serão muito apreciados.
Edit: Estou interessado nesta questão, tanto nas extremidades suaves quanto nas criptograficamente fortes do espectro. No lado mais suave, pode ser usado para tabelas de hash onde as colisões devem ser evitadas, mas não são catastróficas. No lado mais forte, pode ser usado para testes de igualdade.
A família quase universal de funções hash
fonte
fonte