Je viens de tomber sur un scénario dans mon projet où j'ai besoin de comparer les différents objets de l'arborescence de l'égalité avec déjà connu des cas, et ont considéré qu'une sorte d'algorithme de hachage qui fonctionne sur l'arbitraire d'un arbre serait très utile.
Prenez l'exemple de l'arbre suivant:
O / \ / \ O O /|\ | / | \ | O O O O / \ / \ O O
Où chaque O
représente un nœud de l'arbre, est un objet arbitraire, a est associé à une fonction de hachage. Donc, le problème se réduit à: vu le code de hachage de l'nœuds de la structure de l'arbre, et une structure connue, ce qui est un bon algorithme pour le calcul de a (relativement) sans collision code de hachage pour l'ensemble de l'arbre?
Quelques notes sur les propriétés de la fonction de hachage:
- La fonction de hachage doit dépendre sur le code de hachage de chaque nœud dans l'arbre ainsi que sa position.
- Réordonner les enfants d'un nœud devrait nettement changer la résultante de code de hachage.
- Reflétant toute la partie de l'arbre devrait nettement changer la résultante de code de hachage
Si cela peut aider, je suis à l'aide de C# 4.0, ici, dans mon projet, mais je suis principalement à la recherche d'une solution théorique, sorte de pseudo-code, une description, ou d'un code dans un autre langage impératif serait bien.
Mise à JOUR
Eh bien, voici ma propre solution proposée. Il a été beaucoup aidés par plusieurs des réponses ici.
Chaque nœud du sous-arbre/nœud feuille) a pour fonction de hachage:
public override int GetHashCode()
{
int hashCode = unchecked((this.Symbol.GetHashCode() * 31 +
this.Value.GetHashCode()));
for (int i = 0; i < this.Children.Count; i++)
hashCode = unchecked(hashCode * 31 + this.Children[i].GetHashCode());
return hashCode;
}
La bonne chose à propos de cette méthode, comme je le vois, c'est que des codes de hachage peut être mis en cache et recalculées uniquement lorsque le nœud ou l'un de ses descendants changements. (Merci à vatine et Jason Orendorff pour le signaler).
De toute façon, je vous serais reconnaissant si des gens peuvent commenter ma solution proposée ici - si elle ne le travail est bien fait, très bien, sinon d'éventuelles améliorations seraient les bienvenues.