古いバージョンの Visual Basic で使用され、COM オートメーションで広く使用されている OLE バリアントは、さまざまな型を格納できます。整数や浮動小数点数などの基本的な型、文字列や配列などのより複雑な型、さらにはIDispatch
実装やポインターに至るまでです。ByRef
亜種の形。
バリアントは弱い型付けもされます。適用する演算子と、演算子に渡される値の現在の型に応じて、警告なしに値を別の型に変換します。たとえば、整数1
を含むバリアントと文字列を含むバリアントの 2 つのバリアントを比較すると"1"
、等しいかどうかが返されTrue
ます。
VARIANT
したがって、基になるデータ レベル (たとえば、C++ またはDelphi - つまり、さまざまな可能な値の大きな結合)でバリアントを扱っていると仮定するとTVarData
、正しいルールに従うようにバリアントを一貫してハッシュするにはどうすればよいでしょうか?
ルール:
- ハッシュが等しくないバリアントは、ソートと直接の等価性の両方で、等しくないものとして比較する必要があります
- ソートと直接等価の両方で等しいと比較されるバリアントは、等しいとハッシュする必要があります
ハッシュを適合させるために、異なるソート規則と直接比較規則を使用しなければならない場合でも問題ありません。
私が現在取り組んでいる方法は、バリアントを文字列に正規化し (適合する場合)、それらを文字列として扱うことです。それ以外の場合は、バリアント データを不透明なブロブであるかのように処理し、その生バイト。もちろん、これにはいくつかの制限があります。数値の1..10
並べ替え[1, 10, 2, ... 9]
などです。これはやや面倒ですが、一貫性があり、ほとんど作業はありません。ただし、この問題に対して受け入れられている慣行があるかどうかは疑問です。