作家
登录

从Chrome源码看JS Object的实现

作者: 来源: 2017-04-06 11:42:17 阅读 我要评论

int result) { 
  •   int index = Hash(source, name); 
  •   Keykey = keys_[index]; 
  •   key.source = source; 
  •   key.name = name
  •   results_[index] = result; 
    1. int DescriptorLookupCache::Hash(Object* source, Namename) { 
    2.   // Uses only lower 32 bits if pointers are larger. 
    3.   uint32_tsource_hash = 
    4.       static_cast<uint32_t>(reinterpret_cast<uintptr_t>(source)) >> 
    5.       kPointerSizeLog2; 
    6.   uint32_tname_hash = name->hash_field(); 
    7.   return (source_hash ^ name_hash) % kLength; 
     

    先计算map和key的hash,map的hash即source_hash是用map的地址的低32位,为了同一不合指针大年夜小的差别,而计算key的hash即name_hash,最核心的代码应当是以下几行:

    1. uint32_tStringHasher::AddCharacterCore(uint32_trunning_hash, uint16_t c) {  
    2. running_hash += c;  
    3. running_hash += (running_hash << 10);  
    4. running_hash ^= (running_hash >> 6);  
    5. return running_hash;  

    依次轮回name的每个字符串做一些位运算,结不雅累计给running_hash.

    source_hash是用map的内存地址,因为这个地址是独一的,而name_hash是用的字符串的内容,只要字符串一样,那么它的hash值就必定一样,如许包管了同一个object,它的同个key值的索引值就必定一样。source_hash和name_hash最后异或一下,模以kLength = 64获得它在数组琅绫擎的索引。

    这里天然而然会有一个问题,经由过程如许的计算不克不及够包管不合的name计算出来的哈希值必定不一样,好的哈希算法只能让结不雅尽可能随机,然则无法做到必定不反复,所以这里也有同样的问题。

    1. int DescriptorLookupCache::Lookup(Map* source, Namename) {  
    2. int index = Hash(source, name);  
    3. Keykey = keys_[index];  
    4. if ((key.source == source) && (key.name == name)) return results_[index];  
    5. return kAbsent;  

        推荐阅读

        为什么要学习R语言

      示例2 词频分析及词云 R的出生效不雅展示1992年, 肉丝 (Ross Ihaka)和 萝卜特 (Robert Gentleman)两小我在S说话(贝尔实验室开辟的一种统计用编程说话)的基本上开端构思一种新的用于统计学>>>详细阅读


      本文标题:从Chrome源码看JS Object的实现

      地址:http://www.17bianji.com/lsqh/34594.html

    关键词: 探索发现

    乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

    网友点评
    自媒体专栏

    评论

    热度

    精彩导读
    栏目ID=71的表不存在(操作类型=0)