OLE-Varianten, wie von älteren Versionen von Visual Basic und pervasiv in COM Automation verwendet, können viele verschiedene Typen speichern: grundlegende Typen wie Ganzzahlen und Gleitkommazahlen, kompliziertere Typen wie Strings und Arrays und bis zu IDispatch
Implementierungen und Zeiger in Form von Varianten.Was ist die empfohlene Implementierung für Hash-OLE-Varianten?
Varianten sind auch schwach typisiert: Sie konvertieren den Wert in einen anderen Typ ohne Warnung abhängig davon, welchen Operator Sie anwenden und welche die aktuellen Typen der Werte sind, die an den Operator übergeben werden. Wenn Sie beispielsweise zwei Varianten vergleichen, von denen eine die Ganzzahl 1
enthält und eine andere die Zeichenfolge "1"
enthält, wird True
zurückgegeben.
So davon aus, dass ich mit Varianten in der zugrunde liegenden Datenebene (zB VARIANT
in C++ oder TVarData
in Delphi - also die großen Vereinigung von verschiedenen möglichen Werten) gerade arbeitete, wie soll ich Hash konsequent Varianten, so dass sie das Recht zu gehorchen Regeln?
Regeln:
- Varianten, die Hash-ungleicher als ungleich, sowohl in Sortier- und direkte Gleichheit
- Varianten, die sowohl für das Sortieren und direkte Gleichheit sollte gleich
Es ist in Ordnung, wenn ich verschiedene Sortier- und direkte Vergleichsregeln verwenden muss, um das Hashing fit zu machen.
Die Art, wie ich gerade arbeite, ist, dass ich die Varianten zu Strings normalisiere (wenn sie passen), und sie als Strings behandle, sonst arbeite ich mit den Variantendaten, als ob es ein undurchsichtiger Fleck wäre, und Hashing und Vergleich seiner rohen Bytes. Das hat natürlich einige Einschränkungen: Nummern 1..10
Sortierung als [1, 10, 2, ... 9]
etc. Das ist leicht nervig, aber es ist konsistent und es ist sehr wenig Arbeit. Ich frage mich jedoch, ob es für dieses Problem eine akzeptierte Praxis gibt.
VARIANT ist eigentlich eine Struktur, die zwei Daten - Wert und Typ hat. Ihr Vergleichs- und Conversion-Anspruch scheint nur den Wert zu berücksichtigen und schaut nicht auf den Typbereich dieser Struktur. Der richtige Ansatz besteht darin, immer auch den Typ zu berücksichtigen. –
@Franci, ich denke du hast den Punkt verpasst. Zwei Varianten können gleich sein, selbst wenn sich ihre Typen unterscheiden. Wenn die Varianten gleich sind, dann wünscht Barry, dass ihre Hashes auch gleich sind. 'Variante (1) = Variante ('1')' ==> 'hash (Variante (1)) = hash (Variante ('1'))'. –
Barry, ich glaube nicht, dass deine erste Regel richtig ist. Es ignoriert die Möglichkeit von Hash-Kollisionen, bei denen die Hashwerte gleich sind, aber die Werte überhaupt nicht ähnlich sind. –