Verwenden von XSL, um einen Hash der XML-Datei zu erstellen

8

Ich versuche einen Weg zu finden, den Inhalt einer XML-Datei zu "hasen". An der Wurzel davon ist es notwendig, einige Textknoten zu vergleichen, die an Textknoten übergeben werden, von denen ich erwarte, dass sie sicherstellen, dass die Prüfsumme dieselbe ist. Die übergebenen Textknoten sind von einer Formularübergabe zurückgekehrt und ich muss sicherstellen, dass sie nicht geändert wurden (im Rahmen des Zumutbaren, Kollisionen werden ausgeschlossen).

Die Architektur ist schrecklich, also bitte nicht danach fragen! Ich bin in einer bestimmten Implementierung von Sharepoint mit einigen sehr schlechten benutzerdefinierten Code eingesperrt, den ich umgehen muss.

Gibt es eine gut funktionierende Checksum / Hash-Funktion, die implementiert werden kann? Ich müsste über 100 Textknoten überprüfen.

    
electrichead 19.07.2011, 20:00
quelle

1 Antwort

13

Klingt so, als ob Sie eine positionsabhängige Prüfsumme benötigen. Fragen Sie nach einer XSLT-Implementierung oder nur nach dem Algorithmus?

Hier ist eine Implementierung der Fletcher-Prüfsumme in C, die nicht sehr schwer portiert werden sollte XSLT.

Update: Unten ist eine XSLT 2.0-Anpassung der Fletcher-Prüfsumme. Ob es schnell genug ist, hängt von der Größe Ihrer Daten und der Zeit ab, die Sie haben. Ich wäre interessiert zu hören, wie Ihre Tests verlaufen. Um zu optimieren, würde ich versuchen, xs:integer zu xs:int zu ändern.

Beachten Sie, dass ich die einfache Addition für das bitweise ODER ( | ) der Implementierung, die ich oben verlinkt habe, ersetzt habe. Ich bin nicht wirklich qualifiziert, um die Auswirkungen dieser Änderung in Bezug auf Einheitlichkeit oder Nicht-Invertierbarkeit , aber es scheint in Ordnung zu sein, solange Sie nicht einen schlauen Hacker haben, der versucht, Ihre Checksum-Checks böswillig zu umgehen.

Beachten Sie, dass diese Implementierung aufgrund der obigen Änderung nicht die gleichen Ergebnisse wie echte Implementierungen der Fletcher-Prüfsumme (@MDBiker) liefert. Sie können also die Ausgabe dieser Funktion nicht mit der von Java's Fletcher16 vergleichen. Allerdings gibt immer dasselbe Ergebnis für die gleiche Eingabe zurück (es ist deterministisch), so dass Sie die Ausgabe dieser Funktion mit zwei Textzeichenfolgen vergleichen können.

%Vor%

Die Ausgabe:

%Vor%

Hinweis zur Verwendung: Sie haben gesagt, dass Sie eine Prüfsumme für "den Inhalt einer XML-Datei ausführen müssen. An der Wurzel müssen einige Textknoten verglichen werden". Wenn Sie einen Textknoten an foo: checksum () übergeben, funktioniert es einwandfrei: Sein Zeichenfolgenwert wird extrahiert.

Zu Ihrer Information: Ich habe einen Leistungstest durchgeführt, um die Prüfsumme von Textknoten in einer 535 KB XML-Eingabedatei zu berechnen. Hier war die ursprüngliche Vorlage, die ich verwendet habe:

%Vor%

Es endete in 0.8s mit Saxon PE.

Alternativ:

Wenn die Menge an Text nicht sehr groß ist, wäre es wahrscheinlich schneller und genauer, einfach die Zeichenfolgen selbst (anstelle von Prüfsummen) miteinander zu vergleichen. Aber vielleicht können Sie aufgrund Ihrer Architekturbeschränkungen nicht gleichzeitig auf beide Textknoten zugreifen ... Davon bin ich bei Ihrer Beschreibung nicht überzeugt.

    
LarsH 19.07.2011, 22:08
quelle

Tags und Links