1

TClientDataSet を使用してオブジェクトを管理し、オブジェクト データへの「データベース」アクセスを許可しています。これまでのところ、これはうまく機能しています。データセット内に「ObjectName」と「ObjectRef」という 2 つの「特別な」(非表示の) フィールドがあります。ObjectName は、My category.my object' という形式のオブジェクト アイテムのカテゴリと名前の接続詞であり、オブジェクト インスタンス内からレコード番号に移動するために使用されます。このフィールドは索引付けされています。「ObjectRef」は、そのオブジェクトのインスタンスへのポインターの整数の typcast であり、他のすべてのオブジェクトの有効期間管理に使用されます。

「ObjectName」フィールドのサイズを、予想される最大のカテゴリと名前の組み合わせに合わせて選択する必要がありましたが、これは単なるインデックスであり、パフォーマンスとメモリの理由から、このサイズをできるだけ小さくしたいと考えています。ハッシュとして使用できる一意のフォーム「My category.my name」に適用できる「ロスレス」関数はありますか? ハッシュ関数は巧妙に見えますが、コンピューター サイエンスの第一人者ではありません。私はそれらの出力が一意であるかどうかを知る方法がわかりません。

ありがとう

4

2 に答える 2

6

すべてのハッシュ関数には衝突のリスクがありますが、より安全なAFAIKの1つはSHA-1アルゴリズムであり、多くのdelphi実装が存在します。たとえば 、 WindowsのラッパーであるJwsclライブラリ(JEDI Windowsセキュリティコードライブラリ)を使用できます。 CryptoAPI(この質問でdelphiサンプルを見つけることができますSHA1 hashing in Delphi XE)またはTIdHashSHA1Indyの一部であるクラスを使用します。

もう1つの方法は、delphiがBobJenkinsHashメソッドで実装するJenkinsハッシュ関数のようなより単純なハッシュ関数(非暗号化)を使用することです。

于 2012-07-26T20:06:46.037 に答える
2

いいえ。定義上、ハッシュ関数の結果は一意ではありません。

おそらく、アプリケーションで ObjectNames を追跡し、追加されたすべてのオブジェクトに一意のインデックスを関連付けるためにローカル リストを作成する必要があるため、ObjectName の代わりに DB に格納できます。または、作成時にオブジェクトにグローバルに一意のインデックスを割り当てます (例: UInt64)。

于 2012-07-26T08:32:11.713 に答える