WTF HashTable - WebKit中的HashTable

本文详细介绍了HashTable的数据结构及其工作原理,包括Bucket的概念、状态以及插入操作的过程。解释了如何通过哈希函数定位Bucket,并处理冲突的方法。

HashTable是一块线性的连续区域,如下图:

┍━━━━┯━━━━┯━━━━━┯━━━┯━━━┯━━━┯━━━┑

┕━━━━┷━━━━┷━━━━━┷━━━┷━━━┷━━━┷━━━┙

每一格(或块)内存被称为Bucket。TableSize即为Bucket总数。Bucket实际对应一个由用户指定的ValueType。

Bucket状态有三种:Empty, Deleted, Good。

当插入一个Value时,检查Bucket,找出一个可用的Bucket。方法如下:

  1. 初始状态:输入<Key, Value>
  2. 根据Key找到Table上的初始Bucket:h = hash(Key) à i = h & sizeMask àBuckets[i]
  3. 检查当前Bucket是否为空,若为空,则跳转到8;否则继续。
  4. 检查Key与否与当前Bucket上的值相等:Translator::equal(Extractor(Bucket), Key)。若相等,则return <Key_iterator, false>, false代表该Key已存在,插入失败;否则,继续。
  5. 检查当前Bucket是否是Deleted Bucket。是,则由deletedEntry记录此Bucket。继续。
  6. 重新计算i。(认为发生了冲突)当前Bucket = Buckets[i]
  7. 跳转到3。
  8. 如果deletedEntry存在,则清空此Bucket。并把此Bucket设为当前可用Bucket。deletedCount减一。
  9. HashTranslator::translate(Bucket, key, value)
  10. 尝试Expand
  11. return <Key_iterator, true>。true代表插入成功。

Expand的条件:Table为空或者(KeyCount + DeletedCount) * MaxLoad > TableSize。MaxLoad为系数,应该是实验值。目前为2。

转载于:https://www.cnblogs.com/lotushy/archive/2012/06/20/2556275.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值