Considérez la liste faiblement liée dans un cadre purement fonctionnel. Ses louanges ont été chantées du haut des montagnes et continueront d'être chantées. Ici, je vais aborder l'une de ses nombreuses forces et la question de savoir comment l'étendre à la classe plus large de séquences purement fonctionnelles basées sur les arbres.
Le problème est le suivant: vous voulez tester une égalité structurelle presque certaine en temps O (1) au moyen d'un hachage fort. Si la fonction de hachage est structurellement récursive, c'est-à-dire hash (x: xs) = mix x (hash xs), alors vous pouvez mettre en cache de manière transparente les valeurs de hachage sur les listes et les mettre à jour en O (1) lorsqu'un élément est conséré dans une liste existante . La plupart des algorithmes de hachage des listes sont structurellement récursifs, donc cette approche est éminemment utilisable dans la pratique.
Mais supposons qu'au lieu de listes liées individuellement, vous ayez des séquences arborescentes qui prennent en charge la concaténation de deux séquences de longueur O (n) en temps O (log n). Pour que la mise en cache de hachage fonctionne ici, la fonction de mélange de hachage doit être associative afin de respecter les degrés de liberté dont dispose un arbre pour représenter la même séquence linéaire. Le mélangeur doit prendre les valeurs de hachage des sous-arbres et calculer la valeur de hachage de l'arbre entier.
C'est là que j'étais il y a six mois quand j'ai passé une journée à réfléchir et à rechercher ce problème. Il semble n'avoir reçu aucune attention dans la littérature sur les structures de données. Je suis tombé sur l'algorithme de hachage Tillich-Zemor de la cryptographie. Il s'appuie sur une multiplication matricielle 2x2 (qui est associative) où les bits 0 et 1 correspondent aux deux générateurs d'une sous-algèbre avec des entrées dans un champ de Galois.
Ma question est, qu'est-ce que j'ai raté? Il doit y avoir des articles pertinents à la fois dans la littérature sur la cryptographie et les structures de données que je n'ai pas trouvé dans ma recherche. Tout commentaire sur ce problème et les lieux possibles à explorer serait grandement apprécié.
Edit: je suis intéressé par cette question à la fois sur les extrémités douces et cryptographiquement fortes du spectre. Sur le côté plus doux, il peut être utilisé pour les tables de hachage où les collisions doivent être évitées mais ne sont pas catastrophiques. Du côté le plus fort, il peut être utilisé pour les tests d'égalité.