- int DescriptorLookupCache::Hash(Object* source, Name* name) {
- // Uses only lower 32 bits if pointers are larger.
- uint32_tsource_hash =
- static_cast<uint32_t>(reinterpret_cast<uintptr_t>(source)) >>
- kPointerSizeLog2;
- uint32_tname_hash = name->hash_field();
- return (source_hash ^ name_hash) % kLength;
- }
先计算map和key的hash,map的hash即source_hash是用map的地址的低32位,为了同一不合指针大年夜小的差别,而计算key的hash即name_hash,最核心的代码应当是以下几行:
- uint32_tStringHasher::AddCharacterCore(uint32_trunning_hash, uint16_t c) {
- running_hash += c;
- running_hash += (running_hash << 10);
- running_hash ^= (running_hash >> 6);
- return running_hash;
- }
依次轮回name的每个字符串做一些位运算,结不雅累计给running_hash.
source_hash是用map的内存地址,因为这个地址是独一的,而name_hash是用的字符串的内容,只要字符串一样,那么它的hash值就必定一样,如许包管了同一个object,它的同个key值的索引值就必定一样。source_hash和name_hash最后异或一下,模以kLength = 64获得它在数组琅绫擎的索引。
这里天然而然会有一个问题,经由过程如许的计算不克不及够包管不合的name计算出来的哈希值必定不一样,好的哈希算法只能让结不雅尽可能随机,然则无法做到必定不反复,所以这里也有同样的问题。
- int DescriptorLookupCache::Lookup(Map* source, Name* name) {
- int index = Hash(source, name);
- Key& key = keys_[index];
- if ((key.source == source) && (key.name == name)) return results_[index];
- return kAbsent;
推荐阅读
示例2 词频分析及词云 R的出生效不雅展示1992年, 肉丝 (Ross Ihaka)和 萝卜特 (Robert Gentleman)两小我在S说话(贝尔实验室开辟的一种统计用编程说话)的基本上开端构思一种新的用于统计学>>>详细阅读
地址:http://www.17bianji.com/lsqh/34594.html
1/2 1