• WTF HashTable WebKit中的HashTable


    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。

  • 相关阅读:
    《孙子兵法》(前六篇)读书笔记
    写代码的指导思想:如何写出易测、清晰、健壮的牢固代码
    如何从业务代码中抽离出可复用的微组件
    碎碎念集萃二八
    订单同步工程标准化改造事记
    代码的味道
    批量导出51电子发票的pdf文件
    LODOP具体的分类的简短问答
    lodop打印透明图简短问答
    LODOP打印公章的白色透明2
  • 原文地址:https://www.cnblogs.com/lotushy/p/2556275.html
Copyright © 2020-2023  润新知