7

古いバージョンの Visual Basic で使用され、COM オートメーションで広く使用されている OLE バリアントは、さまざまな型を格納できます。整数や浮動小数点数などの基本的な型、文字列や配列などのより複雑な型、さらにはIDispatch実装やポインターに至るまでです。ByRef亜種の形。

バリアントは弱い型付けもされます。適用する演算子と、演算子に渡される値の現在の型に応じて、警告なしに値を別の型に変換します。たとえば、整数1を含むバリアントと文字列を含むバリアントの 2 つのバリアントを比較すると"1"、等しいかどうかが返されTrueます。

VARIANTしたがって、基になるデータ レベル (たとえば、C++ またはDelphi - つまり、さまざまな可能な値の大きな結合)でバリアントを扱っていると仮定するとTVarData、正しいルールに従うようにバリアントを一貫してハッシュするにはどうすればよいでしょうか?

ルール:

  • ハッシュが等しくないバリアントは、ソートと直接の等価性の両方で、等しくないものとして比較する必要があります
  • ソートと直接等価の両方で等しいと比較されるバリアントは、等しいとハッシュする必要があります

ハッシュを適合させるために、異なるソート規則と直接比較規則を使用しなければならない場合でも問題ありません。

私が現在取り組んでいる方法は、バリアントを文字列に正規化し (適合する場合)、それらを文字列として扱うことです。それ以外の場合は、バリアント データを不透明なブロブであるかのように処理し、その生バイト。もちろん、これにはいくつかの制限があります。数値の1..10並べ替え[1, 10, 2, ... 9]などです。これはやや面倒ですが、一貫性があり、ほとんど作業はありません。ただし、この問題に対して受け入れられている慣行があるかどうかは疑問です。

4

3 に答える 3

2

あなたの質問には、ハッシュ関数の使用と、ハッシュの入力に対して検証される規定の要件との間に緊張が組み込まれています。一般的に、ハッシュのいくつかの特性を念頭に置いておくことをお勧めします。ハッシュ処理中に情報が失われ、ハッシュの衝突が予想されます。衝突なしで完全なハッシュを構築することは可能ですが、関数のドメインが可能な OLE Variant である場合、完全なハッシュ関数を構築することは問題があります (または不可能でしょうか?)。一方、完全なハッシュについて話していない場合は、最初のルールに違反しています。

あなたが達成しようとしていることのより大きな文脈はわかりませんが、あなたの仮定の1つを押し戻さなければなりません:ハッシュ関数は本当にあなたが望むものですか? 考えられるすべての OLE Variant 属性をハッシュではなくエンコードするシステムを開発して、後で呼び出して他の Variant イメージと比較できるようにすれば、かなり簡単な方法で要件を満たすことができます。

Variant を文字列表現に変換するベースライン実装は、この方向に進んでいます。ご存じのとおり、Variant にはポインター、ダブル ポインター、および配列を含めることができるため、これらのデータ型の一貫した文字列表現を作成する必要があります。このアプローチが本当にハッシュとして分類できるかどうか疑問に思います。データ属性を保持しているだけではありませんか?

于 2010-03-22T00:35:41.910 に答える
0

等しいVARIANTSのハッシュコードは等しくなければなりません。

平等をテストするために使用される平等と強制のルールを知らなければ、適切な実装を思い付くのは困難です。

于 2010-03-21T17:09:44.513 に答える
0

要約すると、比較可能なものを作成するには、最初に共通の形式、文字列、または blob にストリーミングします。

ローカリゼーション、実数のフォーマットなどをどのように処理しますか? 別のロケールで作成された同じ実数を含む文字列と比較される実数は失敗します。または、異なる精度設定で文字列に書き込まれた実数。

equal() の定義が問題であり、ハッシュではないように思えます。「等しい」値を異なる方法で文字列 (または blob) にシリアル化できる場合、ハッシュは失敗します。

于 2010-03-20T15:33:37.087 に答える