了解HashTable的.NET实现及其存储桶重用

时间:2016-10-19 17:38:37

标签: .net hashtable

.NET HashTable.Insert的实现在实际插入操作之前有以下行:

int emptySlotNumber = -1; // We use the empty slot number to cache the first empty slot. 
                          // We chose to reuse slots create by remove that have the 
                          // collision bit set over using up new slots.

前进到执行实际插入的do-while循环,我们有两个条件来检查这种潜在的重用可能性;它们都检查存储桶是否曾经包含一个条目但现在是否可用,并且在检查是否设置了冲突位(第一个if)或不是(第二个if)方面有所不同:

这是第一个if

if (emptySlotNumber == -1 && (buckets[bucketNumber].key == buckets) &&
                                                 (buckets[bucketNumber].hash_coll < 0)) 

和第二个(请忽略检查预先||运算符,这与我的问题无关):

if ((buckets[bucketNumber].key == null) || // please ignore this line
    (buckets[bucketNumber].key == buckets && 
              ((buckets[bucketNumber].hash_coll & unchecked(0x80000000))==0)))

值得一提的是,如果存储桶设置了冲突位,则HashTable.Remove会初始化hash_coll字段并引用buckets

// Clear hash_coll field, then key, then value
buckets[bn].hash_coll &= unchecked((int)0x80000000);
if (buckets[bn].hash_coll != 0) {
    buckets[bn].key = buckets;
} 
else {
    buckets[bn].key = null;
}
buckets[bn].val = null;

我的问题是:此实施如何有助于使用HashTable的效果?我要感谢一个例子,说明如果HashTable的存储桶实现没有 可能会发生什么(希望这是正确的语法时态) < / sub> buckets[bn].key = buckets的值(但只有&#39; noraml&#39;值或null如果删除)。

0 个答案:

没有答案