我一直在使用TBucketList和TObjectBucketList来满足我的所有哈希需求,但从未体验过切换桶的数量。我依稀记得Data Structures类中的含义,但是有人可以在Delphi中详细阐述这个特定类的细微差别
The following table lists the possible values: Value Number of buckets bl2 2 bl4 4 bl8 8 bl16 16 bl32 32 bl64 64 bl128 128 bl256 256
答案 0 :(得分:6)
TBucketList
和TObjectBucketList
存储指针。他们使用的哈希函数简单地掩盖了地址的高位。被掩盖的位数取决于对象具有多少桶。例如,如果使用bl2
,则会屏蔽31位,并且只有一位地址确定存储区。使用bl256
,指针的整个字节被使用。它是中间两个字节之一。权衡就是你拥有的桶数。一个存储桶只占用8个字节,因此拥有256个字节并不是一个巨大的成本。
除此之外,TBucketList
只是您在数据结构类中学到的普通哈希表。
TIntegerBucketList
使用与其他哈希函数相同的哈希函数。如果您想要更复杂的哈希函数,请编写TCustomBucketList
的后代并覆盖BucketFor
方法。在您的后代类中,您还可以指定受保护的BucketCount
属性,以使用TBucketList
提供的计数以外的其他属性。请注意,由于存储桶计数的更改,类不会重新分配项目,因此在项目已添加到列表之后不要重新分配BucketCount
,除非您打算自己进行重新分发。 / p>