zoukankan      html  css  js  c++  java
  • 【LevelDB源码阅读】Hash

    是什么

    是一种哈希函数,采用的是MurMurHash的一种变体,是一种高效低碰撞的非加密型哈希函数。

    为什么要用

    • 具有较高的平衡性与低碰撞率

    学到什么

    • 对于大块数据,可以分多个小的部分进行哈希计算

    源码分析

    主要就一个hash接口

    uint32_t Hash(const char *data, size_t n, uint32_t seed);
    

    具体实现如下:

    uint32_t Hash(const char *data, size_t n, uint32_t seed) {
      // Similar to murmur hash
      const uint32_t m = 0xc6a4a793;
      const uint32_t r = 24;
      const char *limit = data + n;
      uint32_t h = seed ^ (n * m);
    
      // Pick up four bytes at a time
      while (data + 4 <= limit) {
        uint32_t w = DecodeFixed32(data);
        data += 4;
        h += w;
        h *= m;
        h ^= (h >> 16);
      }
    
      // Pick up remaining bytes
      switch (limit - data) {
        case 3:
          h += static_cast<uint8_t>(data[2]) << 16;
          FALLTHROUGH_INTENDED;
        case 2:
          h += static_cast<uint8_t>(data[1]) << 8;
          FALLTHROUGH_INTENDED;
        case 1:
          h += static_cast<uint8_t>(data[0]);
          h *= m;
          h ^= (h >> r);
          break;
      }
      return h;
    }
    

    其中FALLTHROUGH_INTENDED定义如下:

    // The FALLTHROUGH_INTENDED macro can be used to annotate implicit fall-through
    // between switch labels. The real definition should be provided externally.
    // This one is a fallback version for unsupported compilers.
    #ifndef FALLTHROUGH_INTENDED
    #define FALLTHROUGH_INTENDED 
      do {                       
      } while (0)
    #endif
    
  • 相关阅读:
    pair和map
    lower_bound( )和upper_bound( )
    P1886 滑动窗口 /【模板】单调队列
    数的度(数位dp)
    最小生成树
    刷题-力扣-1052. 爱生气的书店老板
    刷题-力扣-766. 托普利茨矩阵
    刷题-力扣-28. 实现 strStr()
    刷题-力扣-697. 数组的度
    刷题-力扣-1004. 最大连续1的个数 III
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/13072161.html
Copyright © 2011-2022 走看看