私はすべてのハッシュのニーズに TBucketList と TObjectBucketList を使用してきましたが、バケットの数を切り替えたことはありません。これがデータ構造クラスから何を意味するかを漠然と覚えていますが、誰かがDelphiのこの特定のクラスのニュアンスについて詳しく説明できましたか?
次の表に、可能な値を示します。 値 バケット数 bl2 2 bl4 4 bl8 8 bl16 16 bl32 32 bl64 64 bl128 128 bl256 256
私はすべてのハッシュのニーズに TBucketList と TObjectBucketList を使用してきましたが、バケットの数を切り替えたことはありません。これがデータ構造クラスから何を意味するかを漠然と覚えていますが、誰かがDelphiのこの特定のクラスのニュアンスについて詳しく説明できましたか?
次の表に、可能な値を示します。 値 バケット数 bl2 2 bl4 4 bl8 8 bl16 16 bl32 32 bl64 64 bl128 128 bl256 256
TBucketList
ポインタをTObjectBucketList
格納します。彼らが使用するハッシュ関数は、アドレスの上位ビットを単純にマスクします。マスクされるビットの数は、オブジェクトが持つバケットの数によって異なります。たとえば、を使用するbl2
と、31 ビットがマスクされ、アドレスの 1 ビットのみがバケットを決定します。ではbl256
、ポインタのバイト全体が使用されます。中間の 2 バイトの 1 つです。トレードオフは、単にバケットの数です。バケットは 8 バイトしか使用しないため、256 バイトあっても大きなコストにはなりません。
それ以外はTBucketList
、データ構造クラスで学んだような普通のハッシュ テーブルです。
TIntegerBucketList
他と同じハッシュ関数を使用します。より洗練されたハッシュ関数が必要な場合は、メソッドの子孫を記述してTCustomBucketList
オーバーライドしますBucketFor
。子孫クラスでは、保護されたBucketCount
プロパティを割り当てて、 によって提供されるカウント以外のものを使用することもできますTBucketList
。バケット カウントの変更により、クラスはアイテムを再配布する努力をしないことに注意してください。そのため、BucketCount
自分で再配布を行う予定がない限り、アイテムがリストに追加された後に再割り当てしないでください。