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
    
  • 相关阅读:
    HIVE之 Sqoop 1.4.6 安装、hive与oracle表互导
    Sqoop之 Sqoop 1.4.6 安装
    PIG之 Hadoop 2.7.4 + pig-0.17.0 安装
    hadoop之 node manager起不来, 执行mapreduce 程序hang住
    Maven 简介
    graphviz 的节点形状
    graphviz 的绘图布局
    Graphviz 的命令行参数说明
    golang使用graphviz
    IDEA 项目相关基础设置
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/13072161.html
Copyright © 2011-2022 走看看