• 【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
    
  • 相关阅读:
    WTL介绍
    创业创意
    VelocityTracker简单介绍
    strip 命令的使用方法
    CFileDialog的使用方法简单介绍
    讨论oracle在rowid和rownum
    java entry
    24点经典算法
    char与byte差异
    蓝牙设计
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/13072161.html
Copyright © 2020-2023  润新知